2009-03-17 35 views
81

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

Trả lời

121

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

  • Patterns đọc từ dòng lệnh đối với những lệnh mà hỗ trợ họ.
  • 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 các tệp cấp cao hơn (đến gốc) bị ghi đè bởi các tệp ở cấp độ thấp hơn. tập tin.
  • Mẫu được đọc từ $GIT_DIR/info/exclude.
  • Các mẫu được đọc từ tệp được chỉ định bởi biến cấu hình core.excludesfile.

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

  • họ không được nhân rộng cho một kho lưu trữ ở xa
  • họ có thể đã mô hình của họ ghi đè bởi các nguồn khác

(Xem thêm điều này SO question)


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

Tuy nhiên, khi bạn kiểm một chi nhánh hoặc khi bạn git pull, mà "bỏ qua" tình trạng 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 - Difference Between 'assume-unchanged' and 'skip-worktree'".

+0

Bạn có thể sử dụng' update-index --assume-constant' @see http://stackoverflow.com/a/25253144/292408 –

+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 lệnh 'update-index' đó. – VonC

+0

Ngọt ngào, --skip-work-tree rất hữu ích, cảm ơn! –

90

Nếu bạn có thể sửa đổi .git/info/exclude bạn có thể đặt cùng một quy tắc tại đó. Nhưng tệp đó chỉ nằm trong repo địa phương của bạn.

+0

Có vẻ như điều này có lẽ đặt cược tốt nhất của bạn; chúng ta hãy loại trừ các tệp khỏi kho lưu trữ cục bộ của bạn. – Abizern

+1

Tính năng này hoạt động như thế nào với các mô-đun con? Không có thư mục '.git' nào trong một mô-đun con ... – zakdances

+3

@yourfriendzak thư mục' .git' của submodule thực sự là 'parent_repo/.git/modules/submodule_name'. Vì vậy, bạn sẽ chỉnh sửa 'parent_repo/.git/modules/submodule_name/info/exclude' –

17

Có ba cách để nói với GIT những file nào để bỏ qua:

  • file .gitignore
  • $ GIT_DIR/.git/info/loại trừ
  • tập tin chỉ để thông qua core.excludesfile thiết

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

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

0

Bỏ qua những thay đổi cục bộ các tập tin theo dõi: git update-index --assume-unchanged my-file.php

Thôi bỏ qua những thay đổi cục bộ các tập tin đượ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

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

*

Tức là

$ cat > tracked_dir1/tracked_dir2/untracked_dir/.gitignore 
* 
<Ctrl+D> 
Các vấn đề liên quan