Các tệp hiển thị dưới dạng được sửa đổi trực tiếp sau khi sao chép Git


227

Hiện tại tôi đang gặp sự cố với kho lưu trữ và mặc dù Git-fu của tôi thường tốt, tôi dường như không thể giải quyết vấn đề này.

Khi tôi sao chép kho lưu trữ này, sau đó cdvào kho lưu trữ, git statushiển thị một số tệp như đã thay đổi. Lưu ý: Tôi chưa mở kho lưu trữ trong bất kỳ trình chỉnh sửa hoặc bất cứ điều gì.

Tôi đã thử làm theo hướng dẫn này: http://help.github.com/deals-with-lineendings/ , nhưng điều này không giúp ích gì cho vấn đề của tôi.

Tôi đã cố gắng git checkout -- .nhiều lần, nhưng dường như không làm gì cả.

Tôi đang sử dụng máy Mac và không có mô hình con trong kho lưu trữ.

Hệ thống tệp là hệ thống tệp "Nhật ký HFS +" trên máy Mac và không phân biệt chữ hoa chữ thường. Các tệp này là một dòng và khoảng 79 KB mỗi tệp (vâng, bạn đã nghe đúng), vì vậy việc xem xét git diffkhông đặc biệt hữu ích. Tôi đã nghe nói về việc làm git config --global core.trustctime falsecó thể giúp ích, tôi sẽ thử khi quay lại máy tính với kho lưu trữ trên đó.

Tôi đã thay đổi chi tiết của hệ thống tập tin với sự thật! Và tôi đã thử git config --global core.trustctime falsemẹo mà không hiệu quả lắm.

Câu trả lời:


141

Tôi gặp vấn đề tương tự trên Mac sau khi nhân bản một kho lưu trữ. Nó sẽ cho rằng tất cả các tập tin đã được thay đổi.

Sau khi chạy git config --global core.autocrlf input, nó vẫn đánh dấu tất cả các tệp là đã thay đổi. Sau khi tìm cách khắc phục, tôi tìm thấy .gitattributestập tin trong thư mục chính có nội dung như sau.

* text=auto

Tôi đã nhận xét nó và bất kỳ kho lưu trữ nhân bản nào khác kể từ bây giờ đều hoạt động tốt.


5
Cảm ơn! Cuối cùng tôi đã tìm thấy điều này sau khi dành cả buổi tối để bật core.autocrlf và application.whitespace. Điều này đã làm việc. Cảm ơn bạn.
xer0x

5
Dòng vi phạm trong .gitattribut đến từ dotfiles của Mathias Bynen , trong trường hợp có ai khác đi qua điều này.
SeanPONeil

31
bất cứ ai có thể làm sáng tỏ hơn về cấu hình cụ thể này? Không gì * text=autolàm gì? Nó có nghĩa là gì để loại bỏ nó khỏi .gitattributes? Tôi thấy nó khắc phục vấn đề này cho tôi, nhưng tôi không chắc tại sao nó lại làm như vậy, và nó thực sự đang làm gì, và những vấn đề có thể xảy ra là gì?
Dennis

6
@Dennis Cài đặt này giúp bình thường hóa kết thúc dòng, vì vậy xóa nó có thể không phải là câu trả lời đúng. Xem câu trả lời của câu hỏi nàybài viết này . Câu trả lời của @Arrowmaster dưới đây hữu ích hơn cho tôi. Tôi đã sử dụng git addgit commitbình thường hóa các tập tin và đã thoát khỏi vấn đề.
jtpereyda

4
git config --global core.autocrlf inputsửa nó cho tôi Cảm ơn.
dimiguel

89

Tôi hiểu rồi. Tất cả các nhà phát triển khác đều có trên Ubuntu (tôi nghĩ) và do đó có các hệ thống tệp phân biệt chữ hoa chữ thường. Tôi, tuy nhiên, không (như tôi trên máy Mac). Thật vậy, tất cả các tập tin có cặp song sinh chữ thường khi tôi xem chúng bằng cách sử dụng git ls-tree HEAD <path>.

Tôi sẽ lấy một trong số chúng để sắp xếp nó.


Họ đã bao giờ sắp xếp nó ra? Tôi có thể có cùng một vấn đề.
Josh Johnson

8
Vâng, chỉ cần nhờ ai đó có hệ thống tệp phân biệt chữ hoa chữ thường xóa tất cả trừ một tệp từ mỗi bộ tệp có tên tệp trùng lặp trên hệ thống tệp không phân biệt chữ hoa chữ thường.
Sam Elliott

1
Chỉ gặp vấn đề tương tự kể từ khi chuyển từ Ubuntu sang Mac. Cảm ơn, câu trả lời của bạn đánh vào đầu đinh. Hy vọng upvote đẩy nó đến vị trí đầu tiên. :-)
chmac

1
@Dirk đây là lý do tại sao có nhiều câu trả lời. Tôi đã chấp nhận một trong những áp dụng trong trường hợp của tôi, đó không phải là không hợp lý.
Sam Elliott

1
Đây cũng là vấn đề của tôi - MacOS không nhạy cảm. Tuy nhiên git ls-tree HEAD <path>chỉ hiển thị một tập tin duy nhất. Tuy nhiên, tôi đã có thể thấy các tệp trùng lặp trong Giao diện người dùng GitHub.com và cũng sử dụng Giao diện người dùng đó để xóa một phiên bản.
orion elenzil

74
git config core.fileMode false

đã giải quyết vấn đề này trong trường hợp của tôi

https://git-scm.com/docs/git-config

TL; DR;

core.fileMode

Nếu sai, sự khác biệt bit thực thi giữa chỉ mục và cây làm việc bị bỏ qua; hữu ích trên các hệ thống tập tin bị hỏng như FAT. Xem git-update-index (1).

Mặc định là đúng, ngoại trừ git-clone (1) hoặc git-init (1) sẽ thăm dò và đặt core.fileMode sai nếu thích hợp khi kho được tạo.


2
Nhưng cái này làm gì ??
Siwel

1
Tôi cũng muốn biết những gì nó làm, vì nó cũng làm việc cho tôi.
Donato

2
Khi tôi đã làm git diff, tôi thấy rằng những thay đổi chỉ ở chế độ tập tin. git chọn ra chmod -R 777 .điều đó xảy ra khi tôi chạy dự án của mình và cấu hình này cho phép tôi bỏ qua các thay đổi chmod bằng git stackoverflow.com/q/1580596/6207775
Ayushya

1
Liên kết bị hỏng ( "Xin lỗi, chúng tôi không thể tìm thấy hạt nhân của bạn" ).
Peter Mortensen

Phần còn lại của câu trả lời không hoạt động, tuy nhiên điều này đã làm nên điều kỳ diệu!
Gặp Patel

53

Tôi giả sử bạn đang sử dụng Windows. Trang GitHub mà bạn liên kết đến có các chi tiết ngược. Vấn đề là các kết thúc dòng CR + LF đã được cam kết với kho lưu trữ và vì bạn đã đặt core.autocrlf thành true hoặc đầu vào , Git muốn chuyển đổi các kết thúc dòng thành LF, vì vậygit status cho thấy mọi tệp đều bị thay đổi.

Nếu đây là kho lưu trữ mà bạn chỉ muốn truy cập, nhưng không liên quan đến, bạn có thể chạy lệnh sau để chỉ ẩn vấn đề mà không thực sự giải quyết nó.

git config core.autocrlf false

Nếu đây là kho lưu trữ mà bạn sẽ tham gia tích cực và có thể cam kết thay đổi. Bạn có thể muốn khắc phục sự cố bằng cách thực hiện một cam kết thay đổi tất cả các kết thúc dòng trong kho lưu trữ để sử dụng LF thay vì CR + LF và sau đó thực hiện các bước để ngăn chặn sự cố xảy ra trong tương lai.

Sau đây được lấy trực tiếp từ trang man gitattribut và nên được tạo trước từ một thư mục làm việc sạch.

echo "* text=auto" >>.gitattributes
rm .git/index     # Remove the index to force Git to
git reset         # re-scan the working directory.
git status        # Show files that will be normalized.
git add -u
git add .gitattributes
git commit -m "Introduce end-of-line normalization"

Nếu bất kỳ tệp nào không được chuẩn hóa xuất hiện git status, hãy bỏ đặt thuộc tính văn bản của chúng trước khi chạy git add -u.

manual.pdf      -text

Ngược lại, các tệp văn bản mà Git không phát hiện có thể kích hoạt chuẩn hóa thủ công.

weirdchars.txt  text

8
Tôi không sử dụng windows.
Sam Elliott

1
Theo mặc định trên các hệ thống không phải Windows, core.autocrlf được đặt thành false. Vì vậy, bạn thậm chí không gặp phải vấn đề này nếu nó được gây ra bởi kết thúc dòng. Bạn có thể cung cấp thêm chi tiết về thiết lập cụ thể của mình, chẳng hạn như những gì git diffhiển thị cho các tệp git statusđược sửa đổi, cũng như bạn đang sử dụng hệ thống tệp nào?
Arrowmaster

cập nhật câu hỏi với câu trả lời cho những câu hỏi này. Sẽ có cái nhìn khác về tất cả các chi tiết trong một hoặc hai giây. Tôi không chắc những thành viên khác trong nhóm nhà phát triển đang sử dụng
Sam Elliott

Đây là những gì làm việc cho chúng tôi ( git config core.autocrlf falselà đủ). Chúng tôi đã bị lừa bởi thực tế rằng máy khách đang chạy trên Linux (SL / RHEL), nhưng phiên Linux được bắt đầu thông qua x2go từ máy chủ Windows. Vì vậy, đây có thể là giải pháp khả thi nhất trong bối cảnh đồng nhất Win + Lin.
Dirk

37

Vui lòng chạy các lệnh sau. Điều đó có thể giải quyết vấn đề.

# Remove everything from the index.
git rm --cached -r .

# Write both the index and working directory from git's database.
git reset --hard

Không có giải pháp nào khác hiệu quả với tôi, nhưng giải pháp này giúp tôi sao lưu và chạy.
rainabba

1
Tôi đã thử cái này và nó làm việc cho tôi. Cảm ơn ngài LIama!
Danniel Little

Điều này làm cho kho lưu trữ của tôi tồi tệ hơn. Trên một nhánh không có thay đổi, tôi đã có 277 sau khi chạy nó. Tôi cũng có những thay đổi tương tự trên các ngành khác mà tôi đã chuyển sang. Chạy thận trọng. Tôi vừa recloned bởi repo và có 615 tập tin được sửa đổi. :(
Lập trình viên Paul

điều này hiệu quả với tôi khi sử dụng git v2.7.4 với ubfox (WSL), Git cho Windows v2.18.0.windows.1 và posh-git Tôi luôn bị autocrlf sai và sự cố bắt đầu trong Git cho Windows và posh-git sau khi nâng cấp lên 2.18.0 hôm nay
Jim Frenette

Tôi ngạc nhiên công trình này. Cảm ơn đã giúp đỡ. Đối với những người khác đi theo con đường này, các tệp dường như đã được sửa đổi là tất cả các tệp .png và .bmp được quản lý bởi git LFS
David Casper

16

Trong Visual Studio, nếu bạn đang sử dụng Git, bạn có thể tự động tạo các tệp .gitignore và .gitattribut. Tệp .getattribut được tạo tự động có dòng sau:

* text=auto

Dòng này ở gần đầu tập tin. Chúng tôi chỉ cần bình luận dòng bằng cách thêm một # vào phía trước của nó. Sau khi làm điều đó, mọi thứ hoạt động như mong đợi.


1
Cảm ơn, đã đấu tranh với điều này vì những bất ngờ
Andrew Berry

Đây chính xác là vấn đề của tôi. Một nhà phát triển khác đã sử dụng GIT thông qua VS thay vì CLI và tạo tệp .gitattribut này.
Josh Maag

12

Vấn đề cũng có thể phát sinh từ các quyền khác nhau của tệp , như trường hợp của tôi:

Kho lưu trữ nhân bản mới (Windows, Cygwin):

$ git ls-tree HEAD
100755 blob 8099ea496a2c78d71125d79a05855f60ebf07904    testfile
   ↑↑↑

Kho lưu trữ từ xa (Linux):

$ git ls-tree HEAD
100644 blob 8099ea496a2c78d71125d79a05855f60ebf07904    testfile
   ↑↑↑

5

Tôi muốn thêm một câu trả lời trực tiếp hơn vào "Tại sao" điều này xảy ra, bởi vì đã có một câu trả lời tốt về cách khắc phục nó.

Vì vậy, .gitattributescó một * text=autothiết lập, gây ra vấn đề này.

Trong trường hợp của tôi, các tệp trên nhánh chính của GitHub có \r\nkết thúc. Tôi đã quay số cài đặt trên kho lưu trữ để đăng ký với \nkết thúc. Tôi không biết những gì Git kiểm tra mặc dù. Nó được cho là kiểm tra các kết thúc gốc trên hộp Linux của tôi ( \n), nhưng tôi đoán nó đã kiểm tra tệp có các \r\nkết thúc. Git phàn nàn vì nó thấy các \r\nkết thúc đã được kiểm tra trong kho lưu trữ và cảnh báo tôi rằng nó sẽ kiểm tra trong \ncài đặt. Do đó các tập tin là "được sửa đổi".

Đó là sự hiểu biết của tôi bây giờ.


3

Tôi đã từng gặp vấn đề tương tự. Ngoài ra với máy Mac. Nhìn vào kho lưu trữ trên máy Linux tôi nhận thấy rằng tôi có hai tệp:

Geoip.dat và GeoIP.dat

Tôi đã xóa cái không dùng nữa trên máy Linux và nhân bản kho lưu trữ lại cho Mac. Tôi không thể kéo, cam kết, bỏ hoặc lấy từ bản sao của kho lưu trữ khi có bản sao.


3

Vấn đề tương tự đối với tôi. Tôi có thể thấy một số hình ảnh có cùng tên, như "textField.png" và "textfield.png" trong kho Git từ xa, nhưng không phải trên kho lưu trữ cục bộ của tôi. Tôi chỉ có thể thấy "textField.png" không được sử dụng trong mã của dự án.

Hóa ra hầu hết các đồng nghiệp của tôi đang ở trên Ubuntu sử dụng hệ thống tệp ext4 trong khi tôi trên Mac sử dụng APFS.

Cảm ơn Sam Elliott câu trả lời của , giải pháp khá đơn giản. Đầu tiên tôi yêu cầu một đồng nghiệp trên Ubuntu xóa các phiên bản tệp dư thừa bằng chữ hoa, sau đó cam kết và đẩy từ xa.

Sau đó, tôi chạy như sau:

# Remove everything from the index.
git rm --cached -r .

# Write both the index and working directory from git's database.
git reset --hard

Cuối cùng, chúng tôi đã quyết định rằng mọi nhà phát triển nên thay đổi cấu hình Git của mình để ngăn điều này xảy ra lần nữa:

# Local Git configuration
git config core.ignorecase = true

hoặc là

# Global Git configuration
git config --global core.ignorecase = true

Sẽ tốt hơn nếu bạn chỉ trả lờiupvoted @ kds !
Elharony

Có vẻ như lệnh dòng lệnh không nên có dấu bằng ( =) vì nó sẽ kết thúc trong ignorecase = =tệp cấu hình.
Dmytro

1

Tôi cũng có vấn đề tương tự. Trong trường hợp của tôi, tôi đã nhân bản kho lưu trữ và một số tệp ngay lập tức bị mất.

Điều này được gây ra bởi đường dẫn đến tệp và tên tệp quá dài cho Windows. Để giải quyết nó, sao chép kho lưu trữ càng gần gốc ổ đĩa cứng càng tốt để giảm độ dài của đường dẫn đến tệp. Ví dụ, nhân bản nó để C:\A\GitRepothay vì C:\Users Documents\yyy\Desktop\GitRepo.


1

Chỉnh sửa tập tin được gọi là .git/config:

sudo gedit .git/config

Hoặc là:

sudo vim .git/config

Nội dung

[core]
    repositoryformatversion = 0
    filemode = false
    bare = false
    logallrefupdates = true

[remote "origin"]
    url = kharadepramod@bitbucket.org:DigitalPlumbing/unicorn-magento.git
    fetch = +refs/heads/*:refs/remotes/origin/*

[branch "master"]
    remote = origin
    merge = refs/heads/master

[branch "productapproval"]
    remote = origin
    merge = refs/heads/productapproval

Thay đổi filemode=truethành filemode = false.


Điều này tương đương vớigit config core.Filemode false
Guillermo Prandi

1

Đối với các phiên bản macOS mới, điều này có thể do tính năng bảo mật của HĐH.

Trong kho lưu trữ mà tôi đang làm việc, có một tệp nhị phân có * .app là loại tệp.

Đó chỉ là một số dữ liệu được tuần tự hóa, nhưng macOS coi tất cả các tệp * .app là một ứng dụng và vì tệp này không được người dùng tải xuống, hệ thống coi đó là không an toàn và thêm com.apple.quarantinethuộc tính tệp để đảm bảo tệp không thể được thực thi.

Nhưng việc thiết lập thuộc tính này trên tệp cũng là thay đổi tệp và do đó nó xuất hiện trong tập thay đổi Git mà không có cách nào hoàn nguyên nó.

Bạn có thể kiểm tra nếu bạn có cùng một vấn đề bằng cách chạy $ xattr file.app.

Giải pháp khá đơn giản, miễn là bạn không phải làm việc với tệp. Chỉ cần thêm *.app binaryvào của bạn .gitattributes.


0

Tôi đã sao chép kho lưu trữ cục bộ của mình sang một thư mục khác và một loạt các tệp sửa đổi xuất hiện. Cách giải quyết của tôi là: Tôi đã xóa các tệp đã sửa đổi và xóa tệp gốc . Các kho lưu trữ trở nên sạch sẽ.


0

Tôi thấy rằng Git đã coi các tập tin của tôi (.sheet trong trường hợp này) là văn bản. Đặt nó thành một loại nhị phân trong .gitattribut đã giải quyết nó.

*.psd binary

0

Tôi đã cố gắng thực hiện một rebase tương tác, nhưng nó tuyên bố rằng có một số tệp đã được sửa đổi, vì vậy nó sẽ không cho phép tôi làm điều đó ngay bây giờ. Tôi đã thử mọi cách để quay lại kho lưu trữ sạch, nhưng không có gì hiệu quả. Không có câu trả lời nào khác giúp được. Nhưng điều này cuối cùng đã hoạt động ...

git rm -rf the-folder-with-modified-stuff
git ci -m 'WAT'

Bùng nổ! Kho sạch sẽ. Vấn đề được giải quyết. Sau đó, tôi chỉ phải bỏ đi cam kết cuối cùng khi tôi thực hiện rebase -ivà cuối cùng mọi thứ lại sạch sẽ. Kỳ quái!


0

Chỉ trong trường hợp nó giúp được người khác, có thể có một nguyên nhân khác cho vấn đề này: các phiên bản khác nhau của Git. Tôi đang sử dụng phiên bản Git được cài đặt mặc định trên hộp Ubuntu 18.04 (Bionic Beaver) và mọi thứ đều hoạt động tốt, nhưng khi cố gắng sao chép kho lưu trữ bằng Git trên Ubuntu 16.04, một số tệp đã hiển thị dưới dạng đã sửa đổi.

Không có câu trả lời nào khác ở đây khắc phục vấn đề của tôi, nhưng việc nâng cấp các phiên bản Git để phù hợp trên cả hai hệ thống đã khắc phục vấn đề.


1
Sẽ rất hữu ích (và thú vị) để biết phiên bản nào của git không chơi tốt với nhau.
jpaugh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.