Làm cách nào để bỏ qua các tệp nhất định trong Git


731

Tôi có một kho lưu trữ với một tập tin Hello.java. Khi tôi biên dịch nó, một Hello.classtập tin bổ sung được tạo ra.

Tôi đã tạo một mục cho Hello.classtrong một .gitignoretập tin. Tuy nhiên, các tập tin vẫn xuất hiện để được theo dõi.

Làm thế nào tôi có thể làm cho Git bỏ qua Hello.class?


8
Bạn có nghĩa là "nó không hoạt động"? Có lẽ bạn đã thêm Hello. Class vào kho lưu trữ của mình? gitignores không ảnh hưởng đến nội dung đã được theo dõi. Xem ví dụ stackoverflow.com/questions/1139762/gitignore-file-not-ignoring
Cascabel

Câu trả lời:


809

Vấn đề là .gitignorebỏ qua các tệp không được theo dõi trước đó (bởi git add). Chạy git reset name_of_fileđể bỏ tập tin và giữ nó. Trong trường hợp bạn cũng muốn xóa tệp đã cho khỏi kho lưu trữ (sau khi đẩy), hãy sử dụng git rm --cached name_of_file.


190
Lệnh git rm --cached name_of_filesẽ xóa tệp khỏi repo git của bạn. Ngay cả khi bạn thêm nó vào tập tin .gitignore của bạn. Đó không phải là bỏ qua đó là xóa.
OrwellHindenberg

4
Đó dường như là những gì OP muốn trong trường hợp này.
Ondrej Slinták

40
Tôi rất vui vì giải pháp của bạn đã làm việc cho @ Kohan95! Mặc dù câu hỏi này nên được đổi tên dựa trên câu trả lời đã chọn. Nhận xét của tôi chỉ là một cảnh báo cho các nhà phát triển có thể không nhận thức được lệnh này làm gì.
OrwellHindenberg

91
git reset name_of_filexóa theo dõi và không xóa tệp.
Cees Timmerman

7
Đã thử git rm --cached <name_of_file> Nó đã xóa tệp trong repo, nhưng vì nó nằm trong tệp .gitignore, bản sao cục bộ không bị xóa. Một lưu ý nữa, để thêm một thư mục, bạn cần đặt nó vào trong dấu gạch chéo phía trước '/'. Tôi đã xóa thư mục cấu hình của Rubymine trong một dự án ruby ​​mà ai đó đã đăng ký, đó là ".idea". Trong tệp tôi đặt ".idea /" và sau đó "git rm --cached -r .idea" để xóa thư mục và mọi thứ trong đó (vì chỉ git phiên bản tệp, không phải thư mục.)
Doug Noel

222

Làm thế nào để bỏ qua các tập tin mới

Toàn cầu

Thêm (các) đường dẫn vào (các) tệp mà bạn muốn bỏ qua vào .gitignoretệp của mình (và cam kết chúng). Những mục nhập tệp này cũng sẽ áp dụng cho những người khác kiểm tra kho lưu trữ.

Tại địa phương

Thêm đường dẫn vào (các) tệp của bạn mà bạn muốn bỏ qua cho .git/info/exclude tệp . Những mục nhập tệp này sẽ chỉ áp dụng cho bản sao làm việc tại địa phương của bạn.

Làm thế nào để bỏ qua các tập tin thay đổi (tạm thời)

Để bỏ qua các tệp đã thay đổi để được liệt kê là đã sửa đổi, bạn có thể sử dụng lệnh git sau:

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

Để hoàn nguyên sự thiếu hiểu biết đó, hãy sử dụng lệnh sau:

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

Hoàn hảo để ngăn chặn một tập tin giữ một khóa api hiện tại khỏi bị đẩy vào github!
Jim ở Texas

1
@Xman Tại sao bạn nói tạm thời? Tôi đã làm các bước bạn đã đề cập cho localgit bỏ qua, và khởi động lại hệ thống của tôi, nó vẫn hiển thị làm việc trực tiếp sạch sẽ.
Vivek Vardhan

1
Cảm ơn về update-indexthủ thuật hữu ích , hoàn toàn hoàn hảo để tránh thay đổi .gitignoretệp, sau đó được theo dõi bởi Git!
Thomas P.

@mcbjam Không có lệnh bỏ qua git đặc biệt. Chỉnh sửa tệp .gitignore nằm ở vị trí thích hợp trong bản sao làm việc. Sau đó, bạn nên thêm .gitignore này và cam kết nó. Tất cả những người nhân bản repo sẽ bỏ qua những tập tin đó.
Xman Classical

@Vivek Vardhan git update-index - không thay đổi giống như một mặt nạ tạm thời trên chỉ mục. Nó sẽ có hiệu lực cho đến khi bạn tắt nó. Để có thể làm rõ hơn quan điểm của tôi, chỉ mục ban đầu (nghĩa là ngay sau git read-tree) "chứa" tất cả các tệp từ cây-ish vừa được đọc. Do đó, Git "nhắm mắt làm ngơ" một mục chỉ mục không bằng thực sự loại bỏ nó.
Xman Classical

150

Thêm dòng sau vào .gitignore:

/Hello.class

Điều này sẽ loại trừ Hello. Class khỏi git. Nếu bạn đã cam kết, hãy chạy lệnh sau:

git rm Hello.class

Nếu bạn muốn loại trừ tất cả các tệp lớp khỏi git, hãy thêm dòng sau vào .gitignore:

*.class

32
Thêm Hello.classvào .gitignoresẽ bỏ qua bất kỳ tệp nào được gọi Hello.classtrong bất kỳ thư mục con nào. Nếu bạn dự định chỉ bỏ qua tệp Hello.classtrong cùng thư mục với .gitignoretệp, /Hello.classthay vào đó hãy sử dụng một dòng.
ndim

Nơi nào bạn đặt các .gitignoretập tin?
CodyBugstein

6
@Imray bạn có thể đặt .gitignorebất cứ nơi nào trong một dự án git - nếu một đường dẫn bắt đầu /, nó sẽ liên quan đến vị trí của .gitignoretệp; nếu không, nó sẽ tham chiếu đệ quy đến các tệp trong thư mục hiện tại và các thư mục con cháu của nó.
Armand

109

1) Tạo một .gitignoretập tin. Để làm điều đó, bạn chỉ cần tạo một .txttệp và thay đổi phần mở rộng như sau:

Nhập mô tả hình ảnh ở đây

Sau đó, bạn phải thay đổi tên, viết dòng sau trong cửa sổ cmd:

 rename git.txt .gitignore

Trong trường hợp git.txtlà tên của tập tin bạn vừa tạo.

Sau đó, bạn có thể mở tệp và ghi tất cả các tệp bạn không muốn thêm vào kho lưu trữ. Ví dụ, của tôi trông như thế này:

#OS junk files
[Tt]humbs.db
*.DS_Store

#Visual Studio files
*.[Oo]bj
*.user
*.aps
*.pch
*.vspscc
*.vssscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.[Cc]ache
*.ilk
*.log
*.lib
*.sbr
*.sdf
*.pyc
*.xml
ipch/
obj/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Ankh.NoLoad

#Tooling
_ReSharper*/
*.resharper
[Tt]est[Rr]esult*

#Project files
[Bb]uild/

#Subversion files
.svn

# Office Temp Files
~$*

Khi bạn đã có thứ này, bạn cần thêm nó vào kho Git của mình. Bạn phải lưu tệp nơi lưu trữ của bạn.

Sau đó, trong Git Bash, bạn phải viết dòng sau:

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

Nếu kho lưu trữ đã tồn tại thì bạn phải làm như sau:

  1. git rm -r --cached .
  2. git add .
  3. git commit -m ".gitignore is now working"

Nếu bước 2 không hoạt động thì bạn nên ghi toàn bộ lộ trình của các tệp mà bạn muốn thêm.


Bạn có thể sử dụng lệnh "copy con .gitignore" trong lời nhắc và sau đó nhấn CTRL + Z để trực tiếp tạo tệp mà không cần Windows Explorer.
heringer

61

Bỏ qua:

git update-index --assume-unchanged <path/to/file>

Để hoàn tác bỏ qua:

git update-index --no-assume-unchanged <path/to/file>

6
Tôi muốn điều này đứng đầu bảng xếp hạng như là giải pháp cho vấn đề .... Nó rất đơn giản và thanh lịch
user1457958

"Nó rất đơn giản và thanh lịch" - không thực sự : 'Giả sử không thay đổi không nên bị lạm dụng cho một cơ chế bỏ qua. Đó là "Tôi biết các hoạt động của hệ thống tập tin của tôi rất chậm. Tôi sẽ hứa với Git rằng tôi sẽ không thay đổi các đường dẫn này." Đặc biệt, đó không phải là một lời hứa mà Git sẽ luôn coi các đường dẫn này không được sửa đổi nếu Git có thể xác định đường dẫn Ông đã thay đổi mà không phải chịu thêm lstat(2)chi phí, họ có quyền báo cáo rằng đường dẫn đã được sửa đổi (Không git commit -acó quyền cam kết thay đổi đó). '
Chris

47

Bạn có thể sử dụng các phương pháp dưới đây để bỏ qua / không bỏ qua các thay đổi trong các tệp được theo dõi.

  1. Để bỏ qua: git update-index --assume-unchanged <file>
  2. Để hoàn nguyên các tập tin bị bỏ qua: git update-index --no-assume-unchanged <file>

4
Điều đó áp dụng cho tất cả các tập tin? Không rõ làm thế nào những lệnh đó có thể được áp dụng cho chỉ một tệp để bỏ qua / bỏ dấu nó.
javadba

@kapil cuối cùng !! một cái gì đó thực sự hoạt động trong số các biến thể lệnh nghìn tỷ git! Đã thử mọi câu trả lời để bỏ qua một số tệp build.xml ngu ngốc cứ xuất hiện sau mỗi lần xây dựng ... cảm ơn bạn!
killjoy

1
Xin đừng : 'Giả sử không thay đổi không nên bị lạm dụng cho một cơ chế bỏ qua. Đó là "Tôi biết các hoạt động của hệ thống tập tin của tôi chậm. Tôi hứa với Git rằng tôi sẽ không thay đổi các đường dẫn này." Đặc biệt, đó không phải là một lời hứa mà Git sẽ luôn coi các đường dẫn này là không thay đổi Ông đã thay đổi mà không phải chịu thêm lstat(2)chi phí, họ có quyền báo cáo rằng đường dẫn đã được sửa đổi (Không git commit -acó quyền cam kết thay đổi đó). '
Chris

22

Tạo một .gitignoretrong thư mục có .git. Bạn có thể liệt kê các tập tin trong đó được phân tách bằng một dòng mới. Bạn cũng có thể sử dụng ký tự đại diện:

*.o
.*.swp

3
Đó là một thực hành tốt để tránh đưa các mẫu cụ thể của công cụ (tức là các tệp Vim tạm thời của bạn) vào .gitignorecác tệp (trừ khi công cụ đó được ủy quyền bởi dự án). Bạn có thể đặt các mẫu cho các công cụ yêu thích của mình trong mỗi tệp người dùng loại trừ (bộ core.excludesFile); họ sẽ làm việc trên tất cả các kho lưu trữ của bạn. Ví dụ git config --global core.excludesFile "$HOME/.git-user-excludes", sau đó đặt chúng trong tập tin đó.
Chris Johnsen

@Chris: Cảm ơn vì tiền boa. Nhưng tôi chỉ viết nó ở đó bởi vì không có gì tốt hơn trong tâm trí của tôi :)
ga cuối

1
@ChrisJohnsen 'cụ thể công cụ?' cho vim ?? Tôi nghĩ sẽ an toàn khi loại trừ các tệp hoán đổi vim ..
javadba

16

Từ trang GitHub chính thức:

Nếu bạn đã có một tệp được kiểm tra và bạn muốn bỏ qua nó, Git sẽ không bỏ qua tệp nếu bạn thêm quy tắc sau. Trong những trường hợp đó, bạn phải hủy theo dõi tệp trước, bằng cách chạy lệnh sau trong thiết bị đầu cuối của bạn:

git rm --cached FILENAME

hoặc là

git rm --cached .

12

Bạn nên viết một cái gì đó như

*.class

vào .gitignoretập tin của bạn .


4
@AgentZebra Bạn nên thêm một mục *.classvào của bạn .gitignoređể làm cho git bỏ qua tất cả các tệp kết thúc bằng .class.
KingCrunch

7

Thêm tệp nào bạn muốn bỏ qua vào tệp .gitignore:

*.lớp học

*. dự án

* .prefs

*.dự án



5

Nếu bạn đã cam kết tệp và bạn đang cố gắng bỏ qua nó bằng cách thêm vào .gitignoretệp, Git sẽ không bỏ qua. Đối với điều đó, trước tiên bạn phải làm những điều dưới đây:

git rm --cached FILENAME

Nếu bạn đang bắt đầu dự án mới và bạn muốn thêm một số tệp vào Git bỏ qua, hãy làm theo các bước dưới đây để tạo tệp bỏ qua Git:

  1. Điều hướng đến kho Git của bạn.
  2. Nhập "touch .gitignore" sẽ tạo một .gitignoretệp.

3

Bạn cũng có thể sử dụng .gitattribut (thay vì .gitignore) để loại trừ toàn bộ filetypes. Các tập tin khá tự giải thích, nhưng tôi dán nội dung ở đây để tham khảo. Hãy chú ý đến dòng cuối cùng (*. Class nhị phân):

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
*.gif binary
*.ico binary
*.mo binary
*.pdf binary
*.phar binary
*.class binary

2

Thêm dòng sau vào .git / thông tin / loại trừ:
Hello. Class


Bạn có nên thay đổi tập tin trong thư mục .git?
Peter Mortensen

Có lẽ, không phải là một ý tưởng tốt để chạm vào các tệp trong .git bằng tay.
mgyky


2

Trang web này có thể hữu ích và tiết kiệm thời gian khi làm việc với .gitignore.

Nó tự động tạo các tệp .gitignore cho các IDE và hệ điều hành khác nhau với các tệp / thư mục cụ thể mà bạn thường không muốn kéo vào kho Git của mình (ví dụ: các thư mục và tệp cấu hình dành riêng cho IDE).


1

Tôi đã thử điều này -

  1. liệt kê các tập tin mà chúng tôi muốn bỏ qua

git status .idea/xyz.xml .idea/pqr.iml Output .DS_Store

  1. Sao chép nội dung của bước # 1 và nối nó vào tệp .gitignore.

echo " .idea/xyz.xml .idea/pqr.iml Output .DS_Store" >> .gitignore

  1. Xác thực

git status .gitignore

tương tự như vậy, chúng ta có thể thêm thư mục và tất cả các thư mục / tập tin con mà chúng ta muốn bỏ qua trong trạng thái git bằng cách sử dụng directoryname/*và tôi đã thực thi lệnh này từ srcthư mục.


1
  1. Truy cập tệp .gitignore và thêm mục nhập cho các tệp bạn muốn bỏ qua
  2. Chạy git rm -r --cached .
  3. Bây giờ chạy git add .

0

Tôi đã thử --assume-unchangedvà cũng .gitignorenhưng không hoạt động tốt. Chúng làm cho việc chuyển đổi chi nhánh trở nên khó khăn và khó hợp nhất các thay đổi từ người khác. Đây là giải pháp của tôi:

Khi tôi cam kết , tôi tự xóa các tệp khỏi danh sách các thay đổi

Trước khi tôi kéo , tôi giấu các tập tin đã thay đổi. Và sau khi kéo, tôi làm một stash pop .

  1. git stash
  2. kéo git
  3. git stash pop

Bước 3 đôi khi sẽ kích hoạt hợp nhất và có thể dẫn đến xung đột mà bạn cần giải quyết, đó là một điều tốt.

Điều này cho phép tôi giữ những thay đổi cục bộ không được chia sẻ với những người khác trong nhóm.

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.