2014-10-04 18 views
11

Một thời gian trước, tôi thiết lập tập tin .gitignore tôi để không theo dõi một thư mục my_folder với:tập tin theo dõi bên trong bỏ qua thư mục

my_folder/ 

Bây giờ tôi muốn chỉ theo dõi một tập tin cho bên cho biết thư mục, đặt tên my_file.md. Sau khi thực hiện .gitignore trông như thế này:

my_folder/ 
!my_folder/my_file.md 

và kiểm tra:

git status 

file không xuất hiện như một sự thay đổi được thực hiện.

Tôi đang làm gì sai?


Thêm

Tôi đã cố gắng thay đổi file .gitignore tôi để:

my_folder/* 
!my_folder/my_file.md 

như khuyên nhưng tập tin là vẫn không hiển thị như một sự thay đổi cam kết sau một git status. Tôi có cần phải thiết lập lại một cái gì đó?


Thêm 2

Cố gắng thêm các tập tin với git add my_folder/my_file.md lợi nhuận:

The following paths are ignored by one of your .gitignore files: 
my_folder/my_file.md 
Use -f if you really want to add them. 
fatal: no files added 

Lệnh git check-ignore -v my_folder/my_file.md cho:

.gitignore:1:my_folder/* my_folder/my_file.md 
+1

Đợi - nhưng câu trả lời ngắn gọn là sử dụng "my_folder/*" http://stackoverflow.com/questions/5533050/gitignore-exclude-folder-but-include-specific-subfolder –

+0

Cảm ơn @AndrewC, tôi đã thử điều đó nhưng nó vẫn không hoạt động. Không chắc mình đang làm gì sai. – Gabriel

+2

Vì bạn * thực sự * muốn thêm * my_folder/my_file.md * tại sao không sử dụng cờ '-f' khi nó cho bạn biết? – PSkocik

Trả lời

14

Để thêm vào ".gitignore exclude folder but include specific subfolder", một cách tốt để gỡ lỗi t tập tin vòi .gitignore là sử dụng git check-ignore (Git 1.8.4+):

git check-ignore -v my_folder/my_file.md 

Bạn sẽ nhìn thấy nó vẫn bị bỏ qua vì sự cai trị my_folder/.

Đó là bởi vì nó không thể tái bao gồm một tập tin nếu một thư mục cha của tập tin đó sẽ bị loại trừ (*)
(*:. Trừ khi điều kiện nhất định được đáp ứng trong git 2.?+, xem bên dưới)

Đó là lý do bỏ qua các tệp trong thư mục đó (my_folder/*, thay vì chính thư mục) cho phép bạn loại trừ một tệp.

Tất nhiên, bạn có thể buộc thêm tệp bị bỏ qua (git add -f my_folder/my_file.md), nhưng đó không phải là điểm của câu trả lời này.
Vấn đề là giải thích tại sao thêm !my_folder/my_file.md vào .gitignore không hoạt động với git 2.6 trở xuống.


Lưu ý rằng với git 2.9.x/2.10 (giữa năm 2016?), Nó có thể là có thể để lại bao gồm một tập tin nếu một thư mục cha của tập tin đó sẽ bị loại trừ if there is no wildcard in the path re-included.

Nguyễn Thái Ngọc Duy (pclouds) đang cố gắng để thêm tính năng này:

Vì vậy, ở đây, với git 2.8+, điều này sẽ làm việc:

/my_folder 
!my_folder/my_file.md 
+0

VonC bạn sẽ xem xét câu hỏi được cập nhật? Tôi đã thử điều này nhưng nó không hoạt động. – Gabriel

+1

@Gabriel bạn đã cố thêm nó chưa? 'git add my_folder/my_file.md'.'Git check-ignore -v my_folder/my_file.md' trả về cái gì? – VonC

+0

VonC: hãy xem câu hỏi được cập nhật. – Gabriel

14

Một tập tin sẽ không hiển thị như "thay đổi được cam kết" nếu nó chưa được theo dõi (IOW không bao giờ được thêm vào trước). Chỉ cần thêm tệp với git add và Git sẽ chỉ theo dõi tệp nhưng vẫn bỏ qua thư mục.

git add -f ignored_folder/my_file 

Cờ -f là quan trọng, vì git sẽ từ chối thêm tệp từ đường dẫn bị bỏ qua.

1

khi tôi cần theo dõi các tập tin như thế này, hoặc cấu trúc thư mục duy nhất, tôi thêm một cái gì đó như thế này để tập .gitignore tôi

resources/**/*.* 

có nghĩa là, "bỏ qua tất cả các file với phần mở rộng bên trong thư mục nguồn lực bao gồm cả thư mục con" .

Sau đó, tôi đặt một tệp "trống" bên trong các thư mục mà tôi muốn theo dõi.

Lưu ý rằng chỉ các tệp không mở rộng sẽ được theo dõi và đó là lý do tại sao tính năng này hoạt động.

với các tùy chọn được liệt kê dưới đây, bây giờ bạn có thể thêm này:

!resources/my_needed_file.md 

và đó là một giải pháp mà không bao gồm các file bắt buộc, nhưng chỉ là một lựa chọn nếu bạn đang sử dụng tập tin có phần mở rộng.

Tôi hy vọng điều này sẽ giúp ai đó.

Các vấn đề liên quan