sử dụng gitignore để bỏ qua (nhưng không xóa) tệp


97

Tôi có một thư mục tmp trong git repo của mình, tôi muốn vẫn tồn tại, nhưng bị bỏ qua. Tôi đã thêm nó vào .gitignore, nhưng git statusvẫn cho tôi biết về những thay đổi đối với các tệp trong thư mục đó. Tôi đã thử git rm -r --cached, nhưng điều đó sẽ xóa nó khỏi repo từ xa. Làm cách nào để ngừng theo dõi các thay đổi đối với thư mục này, nhưng vẫn cho phép nó tồn tại? Tôi cũng cần thực hiện việc này cho 1 tệp, nhưng các thay đổi đối với tệp đó cũng hiển thị git statussau khi nhập .gitignorechúng. Tôi nên làm gì?


1
vui lòng viết ra tệp .gitignore của bạn chính xác trông như thế nào?
kdehairy

Câu trả lời:


182

Thay vào đó .gitignore, bạn có thể cập nhật kho lưu trữ git cục bộ bằng cách chạy lệnh sau:

git update-index --assume-unchanged <file>

Trong trường hợp này, một tệp đang được theo dõi trong kho gốc. Bạn có thể sửa đổi nó trong repo cục bộ của mình và git sẽ không bao giờ đánh dấu nó là đã thay đổi. Đọc thêm tại:


22
Tình yêu của tôi về git có thể vừa nhân đôi.
Mark Fox

2
Đây phải là câu trả lời được chấp nhận. Cảm ơn vì đã liên kết đến điều đó.
Gowiem

4
Có cách nào để đẩy điều này đến repo từ xa không?
Brian Ortiz

2
hmm tôi thà đánh dấu một tập tin là "nó không phải là một tập tin git, không bao giờ đồng bộ hóa nó với git, ngay cả trong Someones repo khác"
fantastory

11
Bạn có thể hoàn nguyên nó với git update-index --no-assume-unchanged <file>. Nếu bạn muốn liệt kê chúng git ls-files -v | grep '^h'.
Sanghyun Lee

12

Mục đích chính xác của việc bỏ qua các thay đổi được thực hiện đối với tệp trong khi vẫn cho phép chúng tồn tại .gitignore. Vì vậy, thêm các tệp (hoặc thư mục) vào .gitignorelà điều duy nhất bạn phải làm.

Nhưng vấn đề của bạn là git đã theo dõi các tệp bạn muốn bỏ qua và .gitignorekhông áp dụng cho các tệp được theo dõi. Cách duy nhất để dừng theo dõi này là yêu cầu git xóa chúng. Bằng cách sử dụng git rm --cached, bạn ngăn git xóa các tệp cục bộ của mình, nhưng bất kỳ kho lưu trữ nào khác nhận được các thay đổi của bạn sẽ áp dụng việc xóa. Tôi không nghĩ có cách nào để tránh điều đó khỏi kho lưu trữ của riêng bạn. Bạn phải làm điều gì đó trên các kho lưu trữ khác, hoặc chấp nhận các tệp sẽ bị xóa.

Để ngăn chặn việc xóa từng kho lưu trữ khác, bạn có thể:

  • (rõ ràng) sao lưu các tệp ở đâu đó, kéo các thay đổi và khôi phục tệp,
  • hoặc git rm --cachedcác tệp và cam kết trước khi kéo các thay đổi của bạn. Git sẽ hợp nhất hai phần xóa một cách độc đáo mà không cần chạm vào các tệp đã được xóa.

6
Điều đó không nhất thiết phải đúng ("dừng theo dõi = xóa tệp"). Bạn vẫn có thể có một tập tin được theo dõi trong một repo và không thấy bất kỳ thay đổi được thực hiện, sử dụng: git update-index --assume-unchanged <file>. Hãy xem tại: blog.pagebakers.nl/2009/01/29/…
ducin

điều này đã giải quyết được vấn đề của tôi vì tôi cần xóa tệp khỏi repositorie được đẩy trong git như vậy git rm --cached <filename> -r và sau lần đẩy này lại thay đổi thành repositorie nên tệp bị xóa
Vinicius Cardoso

7

Đặt một /ở cuối tên thư mục trong .gitignoretệp của bạn , tức là

tmp/

Nếu có các tệp được theo dõi bên trong thư mục đó, bạn cần yêu cầu git quên chúng trước (trước khi bạn thêm dir vào danh sách bỏ qua). Giả sử bạn không có gì quan trọng trong đó (tức là bạn có thể cào nó):

git rm -rf ./tmp/
git commit -m "untrack tmp dir"
mkdir tmp
echo tmp/ >> .gitignore
git add .gitignore ; git commit -m "add tmp/ to ignore list"

Các tệp mới trong thư mục đó sẽ không được theo dõi.

Các --cachedtùy chọn để git rmchỉ hoạt động trên các chỉ số (chờ thay đổi nhiều hơn hoặc ít hơn). Nó không có ảnh hưởng đến cây làm việc hoặc trạng thái của những gì đã được theo dõi hay không.


Tôi có cái đấy. Cả hai the/dir/the/dir/*
21312312

Này Mat, nếu tôi có một cái gì đó như / Phương tiện trong các thư mục khác nhau mà tôi muốn bỏ qua, có được không? Vì vậy, thích / 1 / Media, / 2 / Media, tất cả các cách lên đến thích 99?
Nic

3

.gitignore không ảnh hưởng đến các tệp được theo dõi.

Những gì bạn muốn là đặt bit giả định không thay đổi trên các tệp trong thư mục tmp /. Có một lời giải thích tốt về cách thực hiện điều đó ở đây: Git: chỉ bỏ theo dõi một tệp trong kho lưu trữ cục bộ và giữ nó trong kho lưu trữ từ xa

Ngoài ra, một lớp lót để thiết lập giả định không thay đổi trên tất cả các tệp trong một thư mục - git update-index --assume-không thay đổi trên thư mục .


1

Có vẻ như bạn đang cố gắng theo dõi một tệp (ví dụ index.php), thêm nó vào kho lưu trữ từ xa, sau đó ngừng theo dõi nó, trong khi giữ tệp trong điều khiển từ xa (tức là giữ index.phpnguyên trên kho từ xa trong khi thay đổi cục bộ).

Theo những gì tôi hiểu, git không thể làm điều này. Bạn có thể theo dõi một tệp hoặc không. Nếu bạn theo dõi một tệp, tệp đó tồn tại trong kho lưu trữ từ xa và thay đổi khi bạn thực hiện các thay đổi đối với tệp đó. Nếu bạn không theo dõi tệp, tệp đó không tồn tại trong kho lưu trữ từ xa.

Vì không thể thực hiện chính xác những gì bạn muốn với git, nên có những giải pháp tiềm năng khác, tùy thuộc vào tình huống chính xác của bạn. Ví dụ, tại sao bạn không muốn index.phpthay đổi trên điều khiển từ xa khi bạn thay đổi cục bộ? Có cài đặt dành riêng cho người dùng trong tệp không? Nếu đúng như vậy, bạn có thể làm:

cp index.php index_template.php
git rm --cached index.php

Bây giờ hãy chỉnh sửa index_template.php như bạn muốn để nó xuất hiện trên repo từ xa. Thêm một cái gì đó vào README của bạn để nói với những người sử dụng kho lưu trữ của bạn rằng một khi họ sao chép nó, họ phải sao chép index_template.php sang index.php và chỉnh sửa nó cho phù hợp với nhu cầu của họ.

git add index_template.php
git add README
git commit -m 'added template index.php file'
git push

Khi ai đó sao chép repo của bạn, họ phải tạo repo của riêng họ index.php. Bạn đã thực hiện nó dễ dàng cho họ: chỉ cần sao chép index_template.phpđến index.phpvà sửa đổi nó với các thiết lập máy tính cụ thể.

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.