Làm thế nào để bạn thực hiện Git bỏ qua các tệp mà không sử dụng .gitignore?


132

Do những ràng buộc kỳ lạ bên ngoài, tôi không thể sửa đổi .gitignorekho lưu trữ của mình. Có cách nào để bỏ qua các tập tin và thư mục ngoài việc sửa đổi một .gitignore? Ngay cả khi đó là một giải pháp toàn cầu như cấu hình toàn cầu sẽ được áp dụng cho tất cả các kho lưu trữ của tôi.

Câu trả lời:


178

Đừng quên, theo gitignore , rằng có một thứ tự ưu tiên trong các "nguồn mẫu bỏ qua" khác nhau mà Git xem xét:

  • Các mẫu đọc từ dòng lệnh cho các lệnh hỗ trợ chúng.
  • Các mẫu được đọc từ tệp .gitignore trong cùng thư mục với đường dẫn hoặc trong bất kỳ thư mục mẹ nào, với các mẫu trong tệp cấp cao hơn (lên đến gốc) bị ghi đè bởi những tệp trong tệp cấp thấp hơn vào thư mục chứa tệp.
  • Các mẫu đọc từ $GIT_DIR/info/exclude.
  • Các mẫu đọc từ tệp được chỉ định bởi biến cấu hình core.excludesfile.

Hai cuối cùng có thể là một giải pháp cho vấn đề của bạn nhưng:

  • chúng không được sao chép cho một kho lưu trữ ở xa
  • họ có thể có các mẫu của họ bị ghi đè bởi các nguồn khác

(Xem thêm câu hỏi SO này )


Hai giải pháp khác liên quan đến việc cập nhật chỉ mục ( git update-index):

Tuy nhiên, khi bạn kiểm tra một chi nhánh khác hoặc khi bạn git pull, trạng thái "bỏ qua" đó có thể được đặt lại. Do đó, tùy chọn khác:

Sự khác biệt giữa hai được giải thích trong " Git - Sự khác biệt giữa ' assume-unchanged' và ' skip-worktree' ".


Bạn có thể sử dụng update-index --assume-unchanged@see stackoverflow.com/a/25253144/292408
Elijah Lynn

1
@ElijahLynn chắc chắn. Bạn cũng có update-index --skip-work-tree. Tôi đã chỉnh sửa câu trả lời để thêm một số liên kết đến câu trả lời cũ của tôi minh họa hai update-indexlệnh đó.
VonC

140

Nếu bạn có thể sửa đổi, .git/info/excludebạn có thể đặt các quy tắc tương tự ở đó. Nhưng tập tin đó chỉ nằm trong repo cục bộ của bạn.


Có vẻ như đây có lẽ là đặt cược tốt nhất của bạn; hãy để bạn loại trừ các tệp khỏi kho lưu trữ cục bộ của bạn.
Abizern 17/03/2016

1
Làm thế nào điều này làm việc với mô hình con? Không có .gitthư mục nào trong mô hình con ...
zakdances

10
@yourfriendzak một .gitthư mục mô hình con thực sự là tại parent_repo/.git/modules/submodule_name. Vì vậy, bạn sẽ chỉnh sửaparent_repo/.git/modules/submodule_name/info/exclude
Kara Brightwell

25

Có ba cách để nói với GIT những tập tin cần bỏ qua:

  • .gitignore các tập tin
  • $GIT_DIR/.git/info/exclude
  • Các tệp được trỏ đến thông qua core.excludesfilecài đặt

Hai điểm sau có thể giải quyết vấn đề của bạn.

Để biết thêm thông tin, xem gitignore (5) .


5

Nếu bạn chỉ muốn có một số tệp cục bộ trong kho lưu trữ và vị trí thư mục con là linh hoạt, bạn có thể đặt các tệp của mình vào tracked_dir1/tracked_dir2/untracked_dir/và sau đó thêm một tệp tracked_dir1/tracked_dir2/untracked_dir/.gitignorecó nội dung như:

*

I E

$ cat > tracked_dir1/tracked_dir2/untracked_dir/.gitignore
*
<Ctrl+D>

4

Tôi đã ở trong những tình huống tương tự, vì vậy tôi đang thêm giải pháp ưa thích của mình mà tôi không thấy được đề cập. Vấn đề với git update-index --assume-unchangedtrong trường hợp này là bạn không thể làm điều đó cho một tệp không bị theo dõi. Bạn đã nói

Tôi không thể sửa đổi .gitignore của kho lưu trữ của tôi.

Tôi sẽ giả định điều bạn muốn nói là bạn không thể đẩy bất kỳ thay đổi nào .gitignorevề nguồn gốc. Nếu đó là trường hợp những gì bạn có thể làm là thêm tệp không bị theo dõi vào địa phương của bạn .gitignore, thì hãy làm git update-index --assume-unchanged .gitignorenhư vậy để thay đổi của bạn .gitignorekhông bao giờ bị đẩy. Bây giờ bạn đang bỏ qua tệp (có thể) không bị theo dõi và không ảnh hưởng đến .gitignoretệp từ xa .


3

Bỏ qua các thay đổi cục bộ đối với các tệp được theo dõi: git update-index --assume-unchanged my-file.php

Bỏ các thay đổi cục bộ cho các tệp được theo dõi: git update-index --no-assume-unchanged my-file.php

nguồn: git help update-index

--[no-]assume-unchanged
           ...
           This option can be also used as a coarse file-level mechanism to ignore uncommitted changes in tracked
           files (akin to what .gitignore does for untracked files). Git will fail (gracefully) in case it needs to
           modify this file in the index e.g. when merging in a commit; thus, in case the assumed-untracked file is
           changed upstream, you will need to handle the situation manually.


1

Cách khác:

  • chỉnh sửa cục bộ .gitignore
  • sau đó git update-index --assume-unchanged .gitignore
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.