Làm cách nào để định cấu hình git để bỏ qua một số tệp cục bộ?


1350

Tôi có thể bỏ qua các tệp cục bộ mà không gây ô nhiễm cấu hình git toàn cầu cho mọi người khác không? Tôi có các tệp không bị theo dõi là spam trong trạng thái git của mình nhưng tôi không muốn thực hiện các thay đổi cấu hình git cho mỗi tệp không bị khóa ngẫu nhiên nhỏ mà tôi có trong các chi nhánh địa phương.

Câu trả lời:


1863

Từ tài liệu Git có liên quan :

Các mẫu dành riêng cho một kho lưu trữ cụ thể nhưng không cần chia sẻ với các kho lưu trữ liên quan khác (ví dụ: các tệp phụ trợ nằm trong kho lưu trữ nhưng dành riêng cho quy trình làm việc của một người dùng) nên đi vào $GIT_DIR/info/excludetệp.

Các .git/info/excludetập tin có định dạng giống như bất kỳ .gitignoretập tin. Một tùy chọn khác là đặt thành core.excludesFiletên của tệp chứa các mẫu chung.

Lưu ý, nếu bạn đã có những thay đổi chưa được thực hiện, bạn phải chạy các bước sau sau khi chỉnh sửa các mẫu bỏ qua của mình:

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

Lưu ý về$GIT_DIR : Đây là một ký hiệu được sử dụng trên toàn bộ hướng dẫn git chỉ để chỉ đường dẫn đến kho git. Nếu biến môi trường được đặt, thì nó sẽ ghi đè vị trí của bất kỳ repo nào bạn đang ở, đây có thể không phải là điều bạn muốn.


Chỉnh sửa : Một cách khác là sử dụng:

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

Đảo ngược nó bằng cách:

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

204
Lưu ý, đảm bảo chạy git update-index --assume-unchanged [<file>...]sau khi thực hiện bổ sung vào tệp loại trừ. Những thay đổi sẽ không được chọn cho đến lúc đó.
phímanz

30
Tôi không cần chạy 'git update-index ...' để các thay đổi có hiệu lực bằng git 1.7.9.5.
Jeffrey Martinez

39
Bạn chỉ cần sử dụng git update-index nếu bạn đã thực hiện thay đổi tệp và bây giờ muốn nó bị bỏ qua. Nếu bạn thay đổi loại trừ trước khi thực hiện thay đổi, thì không cần thiết.
Brady Emerson

13
Mặc dù điều này ngăn tệp xuất hiện dưới dạng thay đổi trong các lần xác nhận như .gitignore, không giống như các tệp bị bỏ qua, (các) tệp sẽ vẫn được đặt lại về phiên bản repo nếu bạn thực hiện git reset --hard.
Brady Emerson

19
Mỗi stackoverflow.com/questions/23097368/...stackoverflow.com/questions/13630849/... , skip-worktreesẽ có khả năng được ưa thích đến assume-unchanged.
danShumway

436

Cập nhật : Cân nhắc sử dụng git update-index --skip-worktree [<file>...]thay thế, cảm ơn @danShumway! Xem giải thích của Borealid về sự khác biệt của hai lựa chọn .


Câu trả lời cũ:

Nếu bạn cần bỏ qua các thay đổi cục bộ đối với các tệp được theo dõi (chúng tôi có các sửa đổi cục bộ đối với các tệp cấu hình), hãy sử dụng git update-index --assume-unchanged [<file>...].


8
Chỉ cần lưu ý, tôi đã thêm một tệp vào $ GIT_DIR / thông tin / loại trừ (ví dụ: my-file.php) và sau đó phải chạy git update-index --assume-unchanged my-file.phpđể bắt đầu bị bỏ qua. Cảm ơn vì tiền hỗ trợ!
phímanz

78
Để hoàn tác nó: git update-index --no-assume-unchanged my-file.php
Ray

18
Chỉ để làm rõ: giả sử không thay đổi là dành cho các tệp được theo dõi (tồn tại trong repo) ... OP đã yêu cầu các tệp không bị khóa, trong trường hợp đó .git/info/excludelà những gì bạn muốn (để tránh gây ô nhiễm .gitignore thường được chia sẻ và theo dõi)
dyodji

7
Theo stackoverflow.com/questions/23097368/, điều này được coi là không an toàn và các tệp của bạn vẫn có thể được cam kết nếu bạn không cẩn thận. Nó nhằm mục đích hỗ trợ hiệu suất, không phải là một giải pháp hoàn hảo cho vấn đề này.
danShumway 16/07/2015

3
Tôi vội vàng đến --assume-unchangedtrước khi đọc cập nhật của bạn . Tôi phá hoại với --no-assume-unchangedsau đó đã làm --skip-worktree... Am I trong rõ ràng?
Nicolas Miari

162

Thêm các dòng sau vào phần [bí danh] trong tệp .gitconfig của bạn

ignore = update-index --assume-unchanged
unignore = update-index --no-assume-unchanged
ignored = !git ls-files -v | grep "^[[:lower:]]"

Bây giờ bạn có thể sử dụng git ignore my_fileđể bỏ qua các thay đổi đối với tệp cục bộ và git unignore my_fileđể bỏ qua các thay đổi. git ignoredliệt kê các tập tin bị bỏ qua.

Câu trả lời này đã được lượm lặt từ http: // git yet.com/interantly/2009/02/18/temporantly-ignoring-files.html .


1
"! git ls-files -v | grep" ^ [[: low:]] "- Bất kỳ cơ hội nào bạn biết cách làm điều này trên windows cmd?
Haohmaru

3
Cài đặt shell thực (ví dụ Babun cung cấp bash hoặc zsh);) Tôi biết cảm giác của bạn, nhưng gần đây tôi đã chuyển từ Windows sang Linux và tôi sẽ không bao giờ sử dụng cmd nữa.
Xerus

@Haohmaru, bạn luôn có thể sử dụng WSL (Hệ thống con Windows cho Linux).
Một Sz

110

Bạn có một vài lựa chọn:

  • Để lại một .gitignoretập tin bẩn (hoặc không được cam kết) trong thư mục làm việc của bạn (hoặc tự động áp dụng nó bằng cách sử dụng topgit hoặc một số công cụ vá như vậy).
  • Đặt các loại trừ trong $GIT_DIR/info/excludetệp của bạn , nếu điều này là cụ thể cho một cây.
  • Chạy git config --global core.excludesfile ~/.gitignorevà thêm các mẫu cho của bạn ~/.gitignore. Tùy chọn này áp dụng nếu bạn muốn bỏ qua các mẫu nhất định trên tất cả các cây. Tôi sử dụng điều này cho .pyc.pyocác tập tin, ví dụ.

Ngoài ra, hãy chắc chắn rằng bạn đang sử dụng các mẫu và không liệt kê rõ ràng các tệp, khi áp dụng.


10
Tôi nghĩ bạn cần git config --globalthiết lập tùy chọn trên toàn cầu.
Josh Lee

7
Trên thực tế, chỉ cần thêm .gitignore vào .gitignore;)!
Dominik George

68

Tôi nghĩ rằng bạn đang tìm kiếm:

git update-index --skip-worktree FILENAME

mà bỏ qua những thay đổi được thực hiện tại địa phương

Dưới đây http://devblog.avdi.org/2011/05/20/keep-local-modutions-in-git-tracked-files/ giải thích thêm về các giải pháp này!

để hoàn tác sử dụng:

git update-index --no-skip-worktree FILENAME

9
Có một cuộc thảo luận có liên quan giữa --skip-worktree--assume-unchangedtại câu hỏi SO này
Merwer

1
Làm thế nào tôi có thể hoàn tác điều này hoặc xem danh sách các tệp / mẫu hiện đang bị bỏ qua --skipworktree, sau này tôi có nên thay đổi ý định và muốn bắt đầu theo dõi lại tệp không?
Bất thường

1
Làm thế nào để hoàn tác điều này?
dùng1735921

3
Để hoàn tác, vui lòng sử dụnggit update-index --no-skip-worktree <file>
user1735921

49

Bạn có thể cài đặt một số bí danh git để làm cho quá trình này đơn giản hơn. Điều này chỉnh sửa [alias]nút của .gitconfigtập tin của bạn .

git config --global alias.ignore 'update-index --skip-worktree'
git config --global alias.unignore 'update-index --no-skip-worktree'
git config --global alias.ignored '!git ls-files -v | grep "^S"'

Các phím tắt này cài đặt cho bạn như sau:

  • git ignore config.xml
    • git sẽ giả vờ rằng nó không thấy bất kỳ thay đổi nào config.xml- ngăn bạn vô tình thực hiện những thay đổi đó.
  • git unignore config.xml
    • git sẽ tiếp tục thừa nhận các thay đổi của bạn thành config.xml- cho phép bạn một lần nữa thực hiện các thay đổi đó.
  • git ignored
    • git sẽ liệt kê tất cả các tệp mà bạn đang "bỏ qua" theo cách được mô tả ở trên.

Tôi đã xây dựng những điều này bằng cách tham khảo câu trả lời của phatmann - trình bày một --assume-unchangedphiên bản giống nhau.

Phiên bản tôi trình bày sử dụng --skip-worktreeđể bỏ qua các thay đổi cục bộ. Xem câu trả lời của Borealid để được giải thích đầy đủ về sự khác biệt, nhưng về cơ bản --skip-worktree, mục đích của các nhà phát triển là thay đổi các tệp mà không có nguy cơ phải thực hiện các thay đổi của họ .

Các git ignoredlệnh trình bày ở đây sử dụng git ls-files -v, và lọc danh sách để hiển thị chỉ những mục bắt đầu với Sthẻ. Các Sthẻ biểu thị một tập tin có tình trạng là "bỏ qua worktree". Để biết danh sách đầy đủ các trạng thái tệp được hiển thị bởi git ls-files: xem tài liệu cho -ttùy chọn trên git ls-files.


1
Điều này không hoạt động đối với các tệp không bị theo dõi: <(git 2.13.5 trên osx)
Terra Ashley

Là '!' lẽ ra phải ở '!git ls-files -v | grep "^S"'? Lệnh không hoạt động với tôi với nó trên đó .. và dường như hoạt động tốt với nó đã bị xóa.
Tiris

dấu chấm than trong bí danh git cho git chạy lệnh bên ngoài , thay vì một tiểu ban git . Tôi đặt nó vào bởi vì tôi cần một đường ống vỏ, vì vậy tôi cần phải gọi git từ bên ngoài. Tôi vừa thử xóa dấu chấm than (theo khuyến nghị của bạn), nhưng điều đó không hiệu quả với tôi. Tôi nhận được Expansion of alias 'ignored' failed; 'git' is not a git command. Điều này thật ý nghĩa; không có dấu chấm than: git bí danh lệnh của bạn git git ls-files ….
Birchlabs

Cảm ơn đã giải thích. Tôi không quen thuộc với bí danh git và chỉ chạy trong một cái vỏ để kiểm tra trước khi tạo bí danh.
Tiris

Đây là một giải pháp tuyệt vời. Vì git track trên mỗi thư mục, khi bạn chạy bí danh ở trên git ignore <filename>, nó chỉ áp dụng cho thư mục đó. Và khi cuối cùng bạn muốn thực hiện các thay đổi của mình đối với tệp đó và cam kết và đẩy sang điều khiển từ xa, chỉ cần sử dụng tiện dụng git unignore <filename>để tạm thời bắt đầu theo dõi lại! Cảm ơn!
nickang

42

Bạn chỉ có thể thêm tệp .gitignore vào thư mục chính của mình, tức là $HOME/.gitignorehoặc ~/.gitignore. Sau đó báo cho git sử dụng tệp đó bằng lệnh:

git config --global core.excludesfile ~/.gitignore

Đây là một tệp .gitignore bình thường có git tham chiếu khi quyết định bỏ qua cái gì. Vì nó nằm trong thư mục nhà của bạn, nó chỉ áp dụng cho bạn và không gây ô nhiễm bất kỳ tệp .gitignore dự án nào.

Tôi đã sử dụng phương pháp này trong nhiều năm với kết quả tuyệt vời.


Cảm ơn, @EricChen. Tôi đã cập nhật ansswer; hãy thử và sau đó sử dụng git check-ignore <file-name>để xác minh. LMK nếu nó hoạt động cho bạn
JESii

Nó chỉ hoạt động với tôi mà không có =:git config --global core.excludesfile ~/.gitignore
E. Sundin

Tôi đặt một .gitignoretập tin trong thư mục nhà và bảo git sử dụng tập tin đó thay vào đó, sau đó xóa các tập tin tôi muốn mở khóa cục bộ. Tuy nhiên, sau khi tôi thay đổi, kho lưu trữ từ xa cũng xóa các tệp đó. Tôi đã làm gì sai sao?
zyy

Ồ, @xyz; .gitignorelà về việc bỏ qua các tập tin tồn tại trong thư mục địa phương của bạn. Những gì bạn nên làm là git rm --cachedloại bỏ chúng khỏi repo nhưng để chúng ở địa phương của bạn. Bạn sẽ có thể quay lại cam kết trước đó của mình với một cái gì đó như git reset --soft HEAD^hoàn tác cam kết đó và khôi phục các tệp của bạn. Đó là vẻ đẹp của git: tất cả vẫn còn đó trong lịch sử git của bạn.
JESii

2

Để bỏ qua các tệp không bị theo dõi, đặc biệt nếu chúng nằm trong (một vài) thư mục không được theo dõi, một giải pháp đơn giản là thêm một .gitignoretệp vào mỗi thư mục không bị theo dõi và nhập vào một dòng duy nhất chứa dòng *tiếp theo. Đó là một giải pháp thực sự đơn giản và dễ hiểu nếu các tệp không bị theo dõi nằm trong một vài thư mục. Đối với tôi, tất cả các tệp đều đến từ một thư mục chưa được mã hóa vendorvà phần trên chỉ hoạt động.


1
Tuyệt quá! FYI: Điều này chỉ hoạt động vì git chỉ theo dõi (và cho phép bạn cam kết) các tệp, không phải các thư mục.
jmiserez

-2

Nếu repo của bạn chưa có tệp .gitignore, thì một giải pháp đơn giản là tạo tệp .gitignore và trong đó thêm .gitignorevào danh sách các tệp sẽ bị bỏ qua.


4
Và nếu sau đó nhóm muốn thêm để thêm một gitignore sau thì sao? Điều này thậm chí làm việc? Nghe có vẻ là một ý tưởng tồi tệ và giống như một cái gì đó thậm chí không hoạt động.
Bjorn

Câu trả lời của anh chàng này làm tôi khó chịu. Không có cách nào ai làm điều này.
Martyn Chamberlin

Đây là một giải pháp nhanh chóng và đơn giản, miễn là có một nơi để đặt nó. Repo của chúng tôi có một .gitignoretập tin chia sẻ ở đầu. Nhưng các tập tin bẩn của tôi nằm trong một thư mục sâu, vì vậy tôi chỉ cần thêm tập tin của riêng mình .gitignorebên cạnh chúng. +1
joeytwiddle
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.