Có cách nào để bảo git chỉ bao gồm một số tệp nhất định thay vì bỏ qua các tệp nhất định không?


165

Các chương trình của tôi thường tạo các tệp đầu ra khổng lồ (~ 1 GB) mà tôi không muốn sao lưu vào kho git. Vì vậy, thay vì có thể làm

git add .

Tôi phải làm một cái gì đó như

git add *.c *.cc *.f *.F *.C *.h *.cu

đó là một chút rườm rà ...

Tôi cảm thấy khá tự tin Tôi có thể viết một tập lệnh perl nhanh chóng ls nội dung thư mục vào .gitignore và sau đó xóa các tệp dựa trên tệp .gitinclude (hoặc một số tên tương tự), nhưng điều đó có vẻ hơi quá. Có cách nào tốt hơn?

Câu trả lời:


230

Tôi không cần phải tự mình thử điều này, nhưng từ khi đọc TFM, có vẻ như một mô hình phủ định sẽ làm những gì bạn muốn. Bạn có thể ghi đè các mục trong .gitignore với các mục bị phủ định sau. Do đó, bạn có thể làm một cái gì đó như:

*.c
!frob_*.c
!custom.c

Để có nó bỏ qua tất cả các tệp .c ngoại trừ custom.c và mọi thứ bắt đầu bằng "frob_"


20
Cảm ơn, TED Điều này đã làm việc. Tất cả những gì tôi phải làm là bắt đầu tệp .gitignore bằng * và sau đó liệt kê tất cả các mẫu tệp được bao gồm của tôi được tiến hành bởi một dấu chấm than.
Daisy Sophia Hollman

8
Làm thế nào về các thư mục? Tôi không thể tìm cách bao gồm các thư mục và tệp bên trong bằng cách phủ định quy tắc.
Marcio Cruz

4
Về thư mục, vui lòng kiểm tra stackoverflow.com/questions/12799855/ trên
uzsolt 16/07/14

2
rất đẹp. Tôi đang sử dụng cái này để có một kho lưu trữ trong thư mục nhà của tôi cho những thứ như vimrc và bashrc
Martin Capodici

1
@uzsolt không hoạt động nếu bạn muốn bao gồm một thư mục cụ thể. xem stackoverflow.com/questions/987142/ Mạnh
DiCaprio

73

tạo tệp .gitignore trong kho lưu trữ của bạn và bạn chỉ muốn theo dõi các tệp c và bỏ qua tất cả các tệp khác sau đó thêm các dòng sau vào tệp ....

*
!*.c

'*' sẽ bỏ qua tất cả các tệp

và! sẽ phủ nhận các tệp bị bỏ qua .... vì vậy ở đây chúng tôi đang yêu cầu git không bỏ qua các tệp c ....


Bạn cũng cần .*cho các tập tin ẩn?
trusktr

2
Đây *là một ký tự đại diện ngay cả cho ., vì vậy các tệp ẩn cũng bị bỏ qua, nhưng sau đó tất cả các tệp ẩn kết thúc bằng .cđược bao gồm.
Rohmer

2
Sử dụng phương pháp này tôi nghĩ các tập tin từ các thư mục con cũng bị bỏ qua. Kiểm tra điều này để biết thêm chi tiết stackoverflow.com/a/11853075/739436
Stelian

1
Tôi đã sử dụng phương pháp này trong thư mục nhà của mình để chỉ theo dõi .bashrc và .bash_history của tôi, ví dụ như *sau !.bash*trong tệp .gitignore
user5359531 17/03/2016

1
Bạn có thể cần *.*trên windows - xem câu trả lời của @Smaranjit Maiti
Martin Capodici 7/07/17

13

Giải pháp tốt nhất để đạt được điều này

tạo .gitignoretập tin trong kho lưu trữ rootvà nếu bạn chỉ muốn bao gồm .ctập tin thì bạn cần thêm các dòng dưới đây vào .gitignoretập tin

*.*
!*.c

điều này sẽ bao gồm tất cả các .ctập tin từ thư mục và thư mục con đệ quy.

sử dụng

*
!*.c

sẽ không hoạt động trên tất cả các phiên bản của git.

Đã thử nghiệm trên

phiên bản git 2.12.2.windows.2


2
Có, tôi có cùng một vấn đề với *, và phải sử dụng *.*. Đây là trên Windows sử dụng gitbash và git phiên bản 2.9.0.windows.1
Martin Capodici

2

Nếu bạn cần bỏ qua các tệp nhưng không phải là một tệp cụ thể trong một thư mục, đây là cách tôi đã làm:

# Ignore everything under "directory"
directory/*
# But don't ignore "another_directory"
!directory/another_directory
# But ignore everything under "another_directory"
directory/another_directory/*
# But don't ignore "file_to_be_staged.txt"
!directory/another_directory/file_to_be_staged.txt

0

Đến bữa tiệc muộn, nhưng giải pháp của tôi sẽ là có một thư mục cho các tệp nguồn và một thư mục khác cho các tệp thực thi và đầu ra chương trình, đại loại như thế này:

+ .git
|    (...)
+ bin
|    my_exe.exe
|    my_output.txt
+ src
     some_file.c
     some_file.h 

... và sau đó chỉ thêm các thứ vào src/kho lưu trữ của tôi và bỏ qua bin/hoàn toàn.

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.