Câu hỏi Làm cách nào để ngừng theo dõi và bỏ qua các thay đổi đối với tệp trong Git?


Tôi đã nhân bản một dự án bao gồm một số .csproj các tập tin. Tôi không cần / như địa phương của tôi csproj các tệp đang được Git theo dõi (hoặc được tạo ra khi tạo bản vá), nhưng rõ ràng chúng là cần thiết trong dự án.

Tôi đã thêm *.csproj đến LOCAL của tôi .gitignore, nhưng các tập tin đã có trong repo.

Khi tôi nhập trạng thái git, nó cho thấy những thay đổi của tôi csproj mà tôi không quan tâm đến việc theo dõi hoặc gửi bản vá.

Làm cách nào để xóa "theo dõi" các tệp này khỏi kho lưu trữ cá nhân của tôi (nhưng giữ chúng trong nguồn để tôi có thể sử dụng chúng) để tôi không thấy các thay đổi khi tôi tạo trạng thái (hoặc tạo bản vá)?

Có cách nào đúng / kinh điển để xử lý tình huống này không?


1433
2018-06-01 19:08


gốc


Một câu hỏi rất hữu ích, nhưng tôi tò mò là tại sao bạn không muốn theo dõi những thay đổi đối với .csproj tập tin, đó là một phần quan trọng của bất kỳ dự án nào. Thay đổi đối với .csproj.user tập tin hoặc bất kỳ .Publish.XML các tệp tôi hoàn toàn có thể hiểu không theo dõi, nhưng tôi tò mò về lý do tại sao bạn không muốn theo dõi .csproj… - Owen Blacker
Có lẽ họ sử dụng một IDE khác nhau? - Jarrett
Trớ trêu thay, tôi đã đi đến chủ đề này bởi vì tôi đang tìm cách để loại bỏ các tập tin .suo từ một repo nhưng giữ chúng tại địa phương. Đối với hậu thế, phát triển .Net yêu cầu bạn giữ các tệp .csproj trong repo và những thay đổi đó sẽ luôn luôn được theo dõi trừ khi bạn muốn cảm thấy cơn thịnh nộ của bất kỳ nhà phát triển nào khác trong dự án của bạn. Nếu không chắc chắn, hãy xem các tệp gitignore repo trên GitHub: github.com/github/gitignore/blob/master/VisualStudio.gitignore - longda
@Cupcake, câu hỏi mà bạn đã liên kết được viết sau 15 ngày sau câu hỏi này? Có lẽ bạn có ý nghĩ khác? - stephenmurdoch
@marflar câu hỏi kinh điển không nhất thiết phải là lâu đời nhất những người, chỉ là tốt những người. Người tôi liên kết có 20 câu trả lời, trong khi câu hỏi này chỉ có 5 câu trả lời.


Các câu trả lời:


Chỉ cần gọi git rm --cached trên mỗi tệp bạn muốn xóa khỏi kiểm soát sửa đổi sẽ ổn. Miễn là các mẫu bỏ qua cục bộ của bạn là chính xác, bạn sẽ không thấy các tệp này được bao gồm trong đầu ra của trạng thái git.

Lưu ý rằng giải pháp này loại bỏ các tệp khỏi kho lưu trữ, vì vậy tất cả các nhà phát triển sẽ cần phải duy trì các bản sao cục bộ (không được sửa đổi) của tệp

Để ngăn không cho phát hiện các thay đổi trong các tệp này, bạn cũng nên sử dụng lệnh sau:

git update-index --assume-unchanged [path]

Những gì bạn có thể muốn làm: (từ phía dưới @Ryan Taylor trả lời)

  1. Điều này là để nói với git bạn muốn phiên bản độc lập của riêng bạn của tập tin hoặc thư mục. Ví dụ: bạn không muốn ghi đè (hoặc xóa)   các tệp cấu hình sản xuất / dàn dựng.

git update-index --skip-worktree <path-name>

Câu trả lời đầy đủ có ở đây trong URL này: http://source.kohlerville.com/2009/02/untrack-files-in-git/


1799
2018-06-01 19:16



"git rm --cached <file>" sẽ xóa <file> khỏi điều khiển phiên bản, trong khi vẫn giữ nó trong kho lưu trữ. Cho dù đó là những gì bạn muốn ... - Jakub Narębski
Nhưng khi người khác sẽ kéo kho, tệp * .csproj của họ sẽ bị xóa không? Bởi vì nếu chúng ta muốn tập tin được untracked, nhưng không bị xóa. - FMaz008
Nếu bạn đang cố gắng loại bỏ TẤT CẢ các tệp trong một thư mục, hãy kết hợp nó với git ls-files: git ls-files | xargs git rm --cached- điều đó sẽ xóa mọi thứ khỏi chỉ mục git trong một thư mục nhất định mà không xóa các tệp thực. - Marco
git rm --cached -r <dir> hoạt động đệ quy trên một thư mục và tất cả các tệp trong đó. - Chris K
Thao tác này sẽ ngừng theo dõi tệp, lưu giữ tệp cục bộ, nhưng làm cho tệp đã xóa cho bất cứ ai kéo - Edward Newell


Nếu bạn làm git update-index --assume-unchanged file.csproj, git sẽ không kiểm tra file.csproj cho các thay đổi tự động: điều đó sẽ ngăn chúng xuất hiện trong trạng thái git bất cứ khi nào bạn thay đổi chúng. Vì vậy, bạn có thể đánh dấu tất cả các tệp .csproj theo cách này - mặc dù bạn sẽ phải đánh dấu thủ công bất kỳ tệp mới nào mà repo ngược dòng gửi cho bạn. (Nếu bạn có chúng trong .gitignore hoặc là .git/info/excludethì những người bạn tạo sẽ bị bỏ qua)

Tôi không hoàn toàn chắc chắn những gì các tệp .csproj là ... nếu chúng là một cái gì đó dọc theo các dòng của các cấu hình IDE (tương tự như các tệp .eclipse và .classpath của Eclipse) thì tôi đề nghị chúng không bao giờ nên được kiểm soát nguồn tại tất cả các. Mặt khác, nếu chúng là một phần của hệ thống xây dựng (như Makefiles) thì rõ ràng là chúng nên --- và cách nhận các thay đổi cục bộ tùy chọn (ví dụ: từ local.csproj a la config.mk) sẽ hữu ích : chia thành phần toàn cầu và phần ghi đè cục bộ.


224
2018-06-01 19:24



Làm cách nào để bạn hoàn tác tác vụ này? - Ian Hunter
git update-index --no-assume-unchanged file.csproj - araqnid
csproj là một tệp dự án C #, theo dõi tệp nào được bao gồm trong dự án của bạn và một vài cấu hình khác, nó PHẢI là nguồn được kiểm soát cho dự án để làm việc - SparK
Đây là câu trả lời đúng ở đây! Tôi đã sử dụng câu trả lời @araqnids trong nhiều năm và nó hoạt động chính xác theo yêu cầu để giải quyết vấn đề này. - NHDaly
@GreenAsJade: git ls-files -v sẽ hiển thị các tệp được giả định không thay đổi với chỉ báo chữ thường (ví dụ: h thay vì thường lệ H cho các tệp được lưu trong bộ nhớ cache). - Amadan


Đây là một quy trình gồm hai bước:

  1. Xóa theo dõi tệp / thư mục - nhưng giữ chúng trên đĩa - sử dụng

    git rm --cached 
    

    Bây giờ chúng không hiển thị là "đã thay đổi" nhưng vẫn hiển thị dưới dạng

        untracked files in  git status -u  
    
  2. Thêm họ vào .gitignore


135
2017-08-02 14:25



Không, điều này sẽ xóa tệp khỏi theo dõi, lưu trữ tệp cục bộ, nhưng làm cho nó bị xóa cho bất cứ ai kéo. - Edward Newell
Trong trường hợp của tôi, tôi vô tình thêm một thư mục mà tôi không muốn theo dõi, vì vậy đây là những gì tôi cần. - Sonny
Có, nó thực sự là câu trả lời sai cho câu hỏi như được hỏi - nhưng nó có lẽ là câu trả lời đúng cho hầu hết mọi người tìm thấy câu hỏi này trong kết quả tìm kiếm (như tôi). - Andrew Spencer


Có 3 lựa chọn, bạn có thể muốn # 3

1. Điều này sẽ giữ cho các tập tin địa phương cho bạn, nhưng sẽ xóa nó cho bất cứ ai khác khi họ kéo.

git rm --cached <file-name> hoặc là git rm -r --cached <folder-name>

2. Đây là để tối ưu hóa, như thư mục có số lượng tệp lớn, ví dụ: SDK có thể sẽ không bao giờ thay đổi. Nó nói với git ngừng kiểm tra thư mục khổng lồ đó mọi lúc để thay đổi, vì nó sẽ không có bất kỳ thư mục nào.

git update-index --assume-unchanged <path-name>

3. Điều này là để nói với git bạn muốn phiên bản độc lập của riêng bạn của tập tin hoặc thư mục. Ví dụ, bạn không muốn ghi đè lên (hoặc xóa) các tệp cấu hình sản xuất / dàn dựng.

git update-index --skip-worktree <path-name>

Điều quan trọng cần biết là git update-index  sẽ không lan truyền với git, và mỗi người dùng sẽ phải chạy nó một cách độc lập.


110
2017-10-26 21:18



Câu trả lời này là câu trả lời hoàn chỉnh nhất - nó cung cấp các giải pháp khác nhau với các phân nhánh của mỗi câu trả lời. Trường hợp cụ thể mà tôi đang làm việc có mật khẩu được nhúng trong tệp cấu hình. Tôi muốn truyền một tệp mẫu rồi thêm mật khẩu vào bản sao của tôi. Bản sao có mật khẩu nên được bỏ qua và không bị ghi đè. - bmacnaughton
Làm thế nào tôi có thể kiểm tra, tại địa phương của tôi, các tập tin nào áp dụng cho 'giả định không thay đổi' hoặc 'bỏ qua-worktree'? - Supawat Pusavanno
@SupawatPusavanno để xem tệp nào bạn đã chọn trước đó cho giả định không thay đổi hoặc bỏ qua worktree nhìn vào câu trả lời này stackoverflow.com/questions/42363881/… -- nó sử dụng grep và git ls-files - Ryan Taylor
Câu trả lời rất hay. Nhưng git ném lỗi khi tôi cố gắng chuyển sang một nhánh khác: lỗi: "Thay đổi cục bộ của bạn đối với các tệp sau sẽ bị ghi đè bằng cách thanh toán ....." và giải pháp là để ngăn chặn các thay đổi trước khi chuyển đổi và bỏ chặn khi bạn quay trở lại chi nhánh. - PhantomReference


Câu trả lời được chấp nhận vẫn không hiệu quả với tôi

Tôi đã sử dụng

git rm -r - cắt.

git add.

git commit -m "sửa lỗi .gitignore"

Tìm thấy câu trả lời từ đây 


78
2017-09-18 05:44



Liên kết đó rất hữu ích, đặc biệt là để loại bỏ đệ quy tất cả các tệp trong tệp .gitignore - rmcsharry
Tôi đã trở lại đây 3 lần, hy vọng tôi có thể cam kết với bộ nhớ trước thời gian tiếp theo! - Harry Bosh


Quên của bạn .gitignore?

Nếu bạn có toàn bộ dự án cục bộ nhưng quên thêm bạn git bỏ qua và hiện đang theo dõi một số tệp không cần thiết, hãy sử dụng lệnh này để xóa mọi thứ

git rm --cached -r .

chắc chắn rằng bạn đang ở gốc của dự án.

Sau đó, bạn có thể làm như bình thường

Thêm vào

git add .

Cam kết

git commit -m 'removed all and added with git ignore'

Đẩy

git push origin master

Phần kết luận

Hy vọng điều này sẽ giúp những người phải thay đổi .gitignore hoặc quên tất cả lại với nhau.

  • Nó xóa toàn bộ bộ nhớ cache
  • Nhìn vào của bạn .gitignore
  • Thêm các tệp bạn muốn theo dõi
  • Đẩy vào repo của bạn

37
2017-11-04 10:25



Khi bạn đang nói về loại bỏ hoặc thêm, bạn đang quên nói khi nào và ở đâu. Xóa khỏi danh sách bản nhạc? Từ kho lưu trữ? Từ không gian dự án địa phương? Loại bỏ lúc kéo? Tại cam kết? Tại đẩy? Than ôi, tất cả các tác giả ở đây đều có cùng một vấn đề. - Gangnus
@ Gangnus Tôi không nghĩ rằng bất cứ ai 'làm rõ' điểm bạn đang cố gắng thực hiện bởi vì nó hoàn toàn rõ ràng rằng các tập tin không thực sự được gỡ bỏ từ đĩa hoặc kho. Câu trả lời này chỉ định thứ tự thời gian của các lệnh. Nó không phải là bí ẩn hoặc không giải thích như bình luận của bạn sẽ đề nghị. - Anthony


Để tiết kiệm thời gian, các quy tắc bạn thêm vào .gitignore có thể được sử dụng để xóa nhiều tệp / thư mục, tức là

git rm --cached app/**/*.xml

hoặc là

git rm --cached -r app/widgets/yourfolder/

e.t.c.


20
2017-11-07 13:18



Đây là một nguyên nhân giải pháp rất tốt trong bất kỳ cơ hội nào bạn muốn sửa bước gitignore theo từng bước - cutiko


Như đã chỉ ra trong các câu trả lời khác, câu trả lời đã chọn là sai.

Các câu trả lời một câu hỏi khác cho thấy rằng nó có thể là bỏ qua-worktree rằng sẽ được yêu cầu.

git update-index --skip-worktree <file>

20
2018-05-12 11:33



Không thật sự lắm: --skip-worktree đã từng giữ tệp trên kho lưu trữ nhưng dừng theo dõi các thay đổi của nó. Như câu trả lời của bạn nói: --skip-worktree hữu ích khi bạn hướng dẫn git không chạm vào một tệp cụ thể nào bởi vì các nhà phát triển Nên thay đổi nó - Erdal G.
@ErdalG. Chính xác. Theo câu hỏi, họ muốn bỏ qua bất kỳ thay đổi nào trong tệp nhưng giữ tệp trong repo - the_new_mr
Đồng ý với @the_new_mr, --assume-unchanged và --skip-worktree có hiệu ứng tương tự nhưng mục đích của chúng hoàn toàn khác nhau. Cái trước là để tăng tốc hiệu suất git bằng cách đánh lừa git không kiểm tra các tệp cụ thể, trong khi cái thứ hai là dành cho bỏ qua những thay đổi trong tương lai trên các tệp cụ thể, phù hợp với thời gian chạy nhưng các tệp cần thiết. - Victor Wong