Tại sao git không nhận ra rằng tệp của tôi đã bị thay đổi, do đó git add không hoạt động


94

Tôi đang cố gắng đẩy các tệp của mình lên github bằng cách sử dụng bash. Chúng đã có ở đó và tôi đang tải lên phiên bản mới hơn với các dòng và mã mới, v.v. Nhưng khi tôi thử git addvà sau đó git statusnó báo:

Trên nhánh chính

không có gì để cam kết, thư mục làm việc sạch sẽ

Và tệp tôi đang sử dụng vừa được sửa đổi.


4
nếu bạn đã cam kết, thì bạn sẽ không có gì để cam kết, hãy kiểm tra git log.
Người chơi Grady

2
đầu ra của git diff là gì?
maazza

2
@maazza tôi nhận được không có gì ngoài diff git
somerandomguy

Nếu git diff(hoặc git status) không hiển thị bất kỳ điều gì giải thích tại sao không có gì để thêm. Vì vậy, câu hỏi thực sự là: "Tại sao git không nhận ra rằng tệp của tôi đã bị thay đổi?"
Sunil D.

Xin lỗi guys, tôi nhìn thấy những gì đang doesnt happening.git thấy rằng visual studio C # thay đổi nó, nhưng nó nhìn thấy khi cái gì khác thay đổi nó, như notepad ++
somerandomguy

Câu trả lời:


121

Tôi đã gặp sự cố trong đó một lần tôi đặt chỉ mục git thành 'giả sử không thay đổi' trên tệp của mình.

Bạn có thể yêu cầu git ngừng bỏ qua các thay đổi đối với tệp bằng:

git update-index --no-assume-unchanged path/to/file

Nếu điều đó không giúp ích cho việc đặt lại có thể là đủ cho các trường hợp kỳ lạ khác.


Trong thực tế, tôi thấy việc xóa tệp đã lưu trong bộ nhớ cache và đặt lại để hoạt động:

git rm --cached path/to/file
git reset path/to/file

git rm --cachednghĩa là chỉ xóa tệp khỏi chỉ mục và resetyêu cầu git tải lại chỉ mục git từ lần cam kết cuối cùng.


15
git add -f path/to/the/filenó sẽ bắt buộc thêm các tệp cho cam kết.
San

2
Câu trả lời này là duy nhất giúp khắc phục sự cố của tôi. Không chắc đó có phải là một thứ của Windows hay không (tôi chưa bao giờ gặp bất kỳ vấn đề nào như thế này trong quá khứ, cả trong osx hoặc linux). Vì vậy, cảm ơn @ThorSummoner. Btw, tôi đã thử git add -ftệp ở trạng thái "giả sử không thay đổi" này và nó không hoạt động - phải git update-indexhoặc git rm --cachedtheo sau bởi một git resetđể làm cho nó hoạt động.
rsenna

1
Ngoài ra, nếu bạn thực sự không chắc chắn về trạng thái repo hiện tại của mình, hãy làm điều này: git rm --cached -r .và sau đó git reset ..
rsenna

Có một tùy chọn khác để thử, git update-index --no-skip-worktree path/to/fileđây là cách tôi giải quyết vấn đề của mình
Fr0sT 22/09/17

1
Làm việc cho tôi, nhưng có chỉ các trường hợp tệp đơn lẻ.
Thomas Cheng

24

Kiểm tra .gitignoretệp của bạn . Bạn có thể thấy rằng tệp hoặc phần mở rộng của tệp hoặc đường dẫn đến tệp bạn đang cố gắng làm việc khớp với một mục nhập .gitignore, điều này sẽ giải thích tại sao tệp đó đang bị bỏ qua (và không được công nhận là tệp đã thay đổi).

Điều này hóa ra đúng với trường hợp của tôi khi tôi gặp vấn đề tương tự.


Thêm một số giải thích nữa; điều đó sẽ giúp ích cho những người khác.
Amit Joshi

1
Tôi đã sử dụng gitignore.io để tạo .gitignore của mình và tôi đã tìm thấy một dòng lib/, điều gì khiến git bỏ qua thư mục này. Không có vấn đề gì với điều đó - ít nhất là nếu thư mục này không phải là thư mục chính từ dự án của bạn, giống như những gì đã xảy ra với tôi.
Paladini

Và đối với bất kỳ ai trong trường hợp của tôi, đó thực sự là tệp loại trừ toàn cầu của tôi
vpzomtrrfrt

Lúc đầu, điều này không hoạt động. Nhưng, tôi phải làm việc. Trong trường hợp của tôi, điều cần bỏ qua đã được đề cập hai lần trong tệp gitignore. Luôn tìm kiếm tất cả các lần xuất hiện và thay thế tất cả.
MasterJoe

8

Giống như nó đã được thảo luận, các tệp có thể được gắn cờ "giả định không thay đổi", về cơ bản, điều này cho git biết rằng bạn sẽ không sửa đổi tệp, vì vậy nó không cần theo dõi các thay đổi với chúng. Tuy nhiên, điều này có thể ảnh hưởng đến nhiều tệp và nếu nó là một không gian làm việc lớn, bạn có thể không muốn kiểm tra tất cả từng tệp một. Trong trường hợp đó, bạn có thể thử: git update-index --really-refresh

theo tài liệu:

Like --refresh, but checks stat information unconditionally, without regard to the "assume unchanged" setting.

Về cơ bản, nó sẽ buộc git theo dõi các thay đổi của tất cả các tệp bất kể cờ "giả định không thay đổi".


1
Đối với tôi git statusnói rằng không có tệp nào được thay đổi, nhưng git add .thêm hai tệp và git update-index --really-refreshnói rằng hai tệp đó cần cập nhật, nhưng dường như không làm được gì. Bất kỳ ý tưởng?
someonewithpc

2
trạng thái git bỏ qua các tệp có cờ giả định không thay đổi. Tuy nhiên, sử dụng git update-index --really-refresh sẽ xóa cờ đó và các tệp bây giờ sẽ hiển thị. Thử chạy lại trạng thái git để xem bây giờ nó có thay đổi các thay đổi hay không. Nếu bạn không thấy bất cứ điều gì, hãy theo dõi bài đăng này: stackoverflow.com/questions/2363197/…, đáng chú ý nhất là lệnh hiển thị danh sách các tệp có các thay đổi giả định: git ls-files -v | grep '^[[:lower:]]'Nếu không có gì hữu ích, bạn nên tạo một câu hỏi với nhiều chi tiết hơn để chúng tôi có thể trợ giúp bạn.
André Cunha

7

Chúng tôi không có đủ để trả lời câu hỏi này nên tôi sẽ đưa ra một số phỏng đoán cho bạn:

1) bạn đã lưu trữ các thay đổi của mình, để sửa chữa loại: git stash pop

2) bạn đã có những thay đổi và bạn đã cam kết, bạn sẽ có thể thấy cam kết của mình trong git log

3) bạn đã có những thay đổi đã thực hiện một cách nào đó git reset --hardhoặc cách khác, những thay đổi của bạn có thể ở đó trong bản cập nhật, nhập git reflog --allsau đó bằng cách kiểm tra hoặc chọn sơ đồ giới thiệu nếu bạn tìm thấy nó.

4) bạn đã kiểm tra cùng một repo nhiều lần, và bạn đã sai.


1) không tìm thấy kho lưu trữ 2) Tôi đã có những thay đổi và cam kết, vậy tôi có thể cam kết lại không? 3) Tôi đã không làm điều đó 4) Tôi đang trong repo đúng
somerandomguy

Nếu bạn đã có những thay đổi và cam kết chúng, thì bạn có thể chuyển sang bước tiếp theo, đẩy hoặc bất cứ quy trình làm việc nào của bạn ... Bạn có thể cam kết lại nếu bạn có nhiều thay đổi hơn, thậm chí bạn có thể git commit --amendđưa những thay đổi mới vào lần cam kết cuối cùng , đừng làm điều đó nếu bạn đã chia sẻ cam kết của mình.
Người chơi Grady

Việc đóng và mở lại thiết bị đầu cuối đã làm điều đó cho tôi sau khi làm sạch repo dự án.
Eddie

6

Nghe có vẻ điên rồ, nhưng đôi khi bạn không ở đúng repo mặc dù bạn nghĩ rằng bạn đang có. Ví dụ: bạn có thể đã chuyển thư mục mẹ, nhưng lại quên chuyển các kho trong trình soạn thảo văn bản của mình. Hoặc ngược lại: bạn đang repo đúng trong trình soạn thảo văn bản nhưng repo sai trong dòng lệnh. Trong tình huống đầu tiên, bạn thực hiện các chỉnh sửa của mình trong đúng tệp nhưng nó không giống với thư mục đang mở trong dòng lệnh của bạn, vì vậy đó thực sự là tệp sai. Trong tình huống thứ hai, bạn thực sự đã chỉnh sửa đúng tệp, nhưng dòng lệnh git của bạn sẽ không nhận ra sự thay đổi vì bạn không ở đúng thư mục trên dòng lệnh.


4

Đã có một điều thú vị như thế này xảy ra. Plugin git của Eclipse Kepler đã tự động đánh dấu tất cả các thư mục dự án của tôi là bị bỏ qua trong thư mục .gitignore.

Khi tôi commitvào Teammenu, tất cả họ sẽ quay lại bỏ qua. Theo như tôi có thể nói, điều này là do tôi đã đặt chúng làm nguồn gốc trong dự án mẹ. Bỏ đánh dấu chúng là đã derviedsửa lỗi này. Tôi chưa bao giờ thấy điều này trước đây trên Indigo. Hy vọng nó sẽ giúp một số người.


Bất kỳ ý tưởng làm thế nào vấn đề này có thể được khắc phục khi nó xảy ra trong intellij?
MasterJoe

3

Điều này đã xảy ra trên Windows khi thay đổi tệp bằng cách chuyển sự khác biệt qua công cụ WinMerge. Rõ ràng WinMerge (ít nhất là cách nó được cấu hình trên máy tính của tôi) đôi khi không cập nhật dấu thời gian của các tệp mà nó thay đổi.

Trên Windows, trạng thái git , sử dụng, trong số những thứ khác, dấu thời gian của tệp và thay đổi kích thước của tệp để xác định xem tệp đã thay đổi hay chưa. Vì vậy, vì tem thời gian không được cập nhật, nó chỉ có kích thước tệp để chạy. Thật không may, tệp được đề cập là một tệp phiên bản đơn giản trong đó nội dung đã thay đổi từ 7.1.2 thành 7.2.0 . Nói cách khác, kích thước tệp cũng không thay đổi. Các tệp khác cũng được thay đổi bởi WinMerge và không có dấu thời gian của chúng được cập nhật nhưng có kích thước khác sau khi thay đổi được phát hiện bằng trạng thái git .


3

Tôi đã gặp sự cố tương tự khi sử dụng Sublime Text-3 . Sau khi thực hiện các thay đổi mới trong mã và lưu nó, khi tôi thử lệnh git add ./status thì phản hồi là "nhánh đã được cập nhật". Tôi đã phát hiện ra, bất kể lưu các bản cập nhật trong trình soạn thảo văn bản, tệp thực sự không thay đổi. Mở tệp trong trình chỉnh sửa khác và lưu các thay đổi phù hợp với tôi.


Điều này cũng đang xảy ra với tôi
Kloar

2

TL; DR; Bạn thậm chí có trên kho lưu trữ chính xác?

Câu chuyện của tôi hơi buồn cười nhưng tôi nghĩ nó có thể xảy ra với một người có thể có một kịch bản tương tự nên chia sẻ nó ở đây.

Trên thực tế trên máy của tôi, tôi có hai kho lưu trữ git riêng biệt repo1và được repo2định cấu hình trong cùng một thư mục gốc có tên source. Hai kho này về cơ bản là kho của hai sản phẩm tôi đang làm và đang làm trong công ty của mình. Bây giờ vấn đề là như một hướng dẫn tiêu chuẩn, cấu trúc thư mục mã nguồn của tất cả các sản phẩm hoàn toàn giống nhau trong công ty của tôi.

Vì vậy, mà không nhận ra, tôi đã sửa đổi một tệp có tên chính xác repo2mà tôi được cho là phải thay đổi repo1. Vì vậy, tôi chỉ giữ lệnh chạy git statustrên repo1và nó giữ cho cùng một thông điệp

Trên nhánh chính

không có gì để cam kết, thư mục làm việc sạch sẽ

trong nửa giờ. Sau đó, đồng nghiệp của tôi đã quan sát nó như một cặp mắt độc lập và đưa điều này đến với tôi rằng tôi đã nhầm nhưng lại trông rất giống kho lưu trữ. Thời điểm tôi chuyển sang repo1Git bắt đầu nhận thấy các tệp đã thay đổi.

Trường hợp không phổ biến như vậy. Nhưng bạn không bao giờ biết!


2

Bạn có di chuyển thư mục ra khỏi trình bao của bạn không? Điều này có thể xảy ra nếu bạn khôi phục dự án của mình từ một bản sao lưu. Để khắc phục điều này, chỉ cần cdra và vào lại:

cd ../
cd -

Wow, đây là trường hợp. Khùng. Một thủ thuật khác đã không hoạt động ở tất cả!
Makalele

1

Nói chung với vấn đề này, trước tiên, hãy kiểm tra xem bạn có đang chỉnh sửa tệp mà bạn cho là mình không! Tôi đã gặp sự cố này khi đang chỉnh sửa tệp JavaScript đã chuyển đổi thay vì tệp nguồn (phiên bản đã chuyển đổi không được kiểm soát nguồn).


cảm ơn bạn đã đề cập đến điều này! Tôi đã rất thuyết phục rằng tôi đã cập nhật đúng tệp. Không. mặt cọ
Ashley Grenon

1

Ứng dụng khách Git của tôi (Gitg) đã gây ra sự cố này cho tôi. Các lệnh bình thường mà tôi thường chạy không hoạt động. Ngay cả khi chạm vào mọi tệp trong dự án cũng không hoạt động.

Tôi đã tìm ra cách để khắc phục và tôi vẫn không rõ nguyên nhân gây ra nó. Sao chép thư mục dự án của bạn. Các tệp bị thiếu sẽ hiển thị trong thư mục đã sao chép git status. Đổi tên có thể làm điều tương tự.


1

Chạy vào vấn đề, nhưng đó chỉ là hai thư mục và tôi không biết là cả hai thư mục đó đều được định cấu hình dưới dạng mô-đun con git. Điều đó đã xảy ra như thế nào Tôi không có manh mối, nhưng quá trình là làm theo một số hướng dẫn trên liên kết này, nhưng KHÔNG xóa thư mục (như anh ta làm ở cuối) mà là làmgit add path/to/dir


1

Khi bạn chỉnh sửa tệp trong Visual Studio, tệp đó sẽ được liệt kê trong các thay đổi git ngay lập tức ngay cả khi tệp chưa được lưu. Vì vậy, tất cả những gì bạn cần làm chỉ là lưu tệp theo cách thủ công (Ctrl + S cho tệp đang hiển thị hoặc Ctrl + Shift + S cho tất cả tệp dự án) và git bash sẽ chọn chúng.


Điều này phù hợp với tôi khi thêm nhận xét vào .jstệp, làm việc với Visual Studio Code. Cảm ơn bạn.
SnuKies

0

Bạn đã cố gắng tải lên loại tệp nào? Bây giờ tôi chỉ dành gần một giờ để tải lên bản sửa đổi css của mình. Nhưng css này được biên dịch từ một tệp styl do đó git đã bỏ qua nó. Khi tôi thay đổi nguồn styl thì mọi thứ đều hoạt động.

Hy vọng nó giúp.


0

Đôi khi phụ thuộc và theo phiên bản git và nếu bạn quên làm git add ..

Để kiểm tra sự thay đổi của bạn, hãy sử dụng kho lưu trữ luôn git statushiển thị tất cả các tệp chưa được theo dõi và đã thay đổi. Bởi vì git diffchỉ hiển thị các tệp được thêm vào.


0

Đảm bảo không tạo liên kết tượng trưng ( ln -s source dest) từ bên trong Git Bash dành cho Windows.

Nó KHÔNG tạo liên kết tượng trưng, ​​nhưng thực hiện một bản sao SÂU của nguồn tới đích

Tôi đã gặp phải hành vi tương tự như OP trên thiết bị đầu cuối MINGW64 từ Git Bash dành cho Windows (phiên bản 2.16.2) để nhận ra rằng các thay đổi 'đã chỉnh sửa' của tôi thực sự nằm trong thư mục gốc và các lệnh git bash của tôi là từ trong bản sao sâu vẫn còn không thay đổi.


0

Tôi đã từng gặp vấn đề tương tự. Hóa ra tôi có hai bản sao của dự án và thiết bị đầu cuối của tôi nằm trong thư mục dự án sai!


0

Nó cũng tình cờ với tôi, tôi đã thử các phương pháp được đề cập ở trên và không có gì giúp ích. Sau đó, giải pháp là thay đổi tệp thông qua thiết bị đầu cuối, không phải GUI. Tôi không biết tại sao điều này làm việc nhưng đã hiệu quả. Sau khi tôi chỉnh sửa tệp qua nano từ terminal git nhận ra nó đã thay đổi và tôi có thể thêm nó và cam kết.


Bạn đã tìm ra giải pháp cho việc này chưa? Tôi đã đấu tranh với việc git của mình không nhận ra các tệp đã thay đổi của tôi khi tôi sử dụng bất kỳ công cụ hợp nhất nào và cách duy nhất để git xem các thay đổi là sử dụng nano cho các lần hợp nhất của tôi, việc này mất nhiều thời gian hơn. Các tệp bị xung đột ban đầu hiển thị với git, sau khi được chỉnh sửa bằng công cụ hợp nhất, chúng sẽ hiển thị là "không thay đổi" trên git.
Lucas P.

tôi không biết tại sao nó hoạt động và nó hoạt động như thế nào nhưng nó hoạt động cho tôi cảm ơn
Amit Bisht

0

tôi gặp vấn đề tương tự ở đây VS2015 không nhận ra các thay đổi tệp js của tôi, việc xóa điều khiển từ xa khỏi cài đặt kho lưu trữ và sau đó thêm lại đường dẫn URL từ xa đã giải quyết được vấn đề của tôi.


0

Tôi gặp sự cố tương tự khi tạo tệp vá trong máy chủ bằng trình chỉnh sửa vi. Có vẻ như vấn đề là với khoảng cách. Khi tôi đẩy bản vá từ cục bộ, việc triển khai đã phù hợp.


-1

Tôi đã có vấn đề này. Của tôi không hoạt động vì tôi đang đặt các tệp của mình trong thư mục .git bên trong dự án của mình.


-1

Trong trường hợp của tôi, thực hiện git reset --hardxóa các tệp và để lại một số thư mục trống. Sau khi kiểm tra nội dung, tôi nhận thấy các thư mục trống rỗng.

Tuy nhiên git bỏ qua các thư mục trống. (Sửa lại, git bỏ qua tất cả các thư mục vì nó theo dõi nội dung, các thư mục trống không phải là nội dung.)


-5

git add * sau đó cố gắng sử dụnggit commit


1
Chào mừng đến với SO! Điều này có thể không trả lời câu hỏi và đã có 9 câu trả lời ở đây. Hãy chuyển nỗ lực của bạn cho những câu hỏi cần trả lời!
Cris Luengo
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.