Apakah ada cara untuk memberitahu git untuk hanya menyertakan file tertentu daripada mengabaikan file tertentu?

165

Program saya umumnya menghasilkan file keluaran besar (~ 1 GB) yang saya tidak ingin mencadangkan ke repositori git. Jadi alih-alih bisa melakukannya

git add .

Saya harus melakukan sesuatu seperti

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

yang sedikit rumit ...

Saya merasa cukup percaya diri saya bisa menulis skrip perl cepat ls isi direktori ke .gitignore dan kemudian menghapus file berdasarkan file .gitinclude (atau beberapa nama yang serupa), tapi itu tampaknya agak terlalu meretas. Apakah ada cara yang lebih baik?

Daisy Sophia Hollman
sumber

Jawaban:

231

Saya tidak perlu mencoba ini sendiri, tetapi dari membaca TFM saya sepertinya pola yang dinegasikan akan melakukan apa yang Anda inginkan. Anda dapat mengganti entri dalam .gitignore dengan entri yang dinegasikan nanti. Dengan demikian Anda dapat melakukan sesuatu seperti:

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

Untuk membuatnya mengabaikan semua file .c kecuali custom.c dan apa pun yang dimulai dengan "frob_"

TED
sumber
20
Terima kasih, TED Ini berhasil. Yang harus saya lakukan adalah memulai file .gitignore dengan * dan kemudian daftar semua pola file saya yang disertakan dilanjutkan dengan tanda seru.
Daisy Sophia Hollman
8
Bagaimana dengan folder? Saya tidak dapat menemukan cara untuk memasukkan folder dan file di dalamnya dengan meniadakan aturan.
Marcio Cruz
4
Tentang folder, silakan periksa stackoverflow.com/questions/12799855/…
uzsolt
2
sangat bagus. Saya menggunakan ini untuk memiliki repositori di folder rumah saya untuk hal-hal seperti vimrc dan bashrc
Martin Capodici
1
@uzsolt tidak berfungsi jika Anda ingin menyertakan satu folder tertentu. lihat stackoverflow.com/questions/987142/…
DiCaprio
73

buat file .gitignore di repositori Anda dan Anda ingin melacak hanya file c dan mengabaikan semua file lain kemudian menambahkan baris berikut ke dalamnya ....

*
!*.c

'*' akan mengabaikan semua file

dan! akan meniadakan file menjadi diabaikan .... jadi di sini kami meminta git untuk tidak mengabaikan file c ....

Vineel Kumar Reddy
sumber
Apakah Anda juga memerlukan .*file tersembunyi?
trusktr
2
The *adalah wildcard bahkan untuk ., file jadi tersembunyi juga diabaikan, tetapi file maka semua tersembunyi berakhir di .cdisertakan.
Rohmer
2
Menggunakan metode ini, saya pikir file dari subfolder juga diabaikan. Periksa ini untuk lebih jelasnya stackoverflow.com/a/11853075/739436
Stelian
1
Saya menggunakan metode ini di direktori home saya untuk hanya melacak misalnya .bashrc dan .bash_history saya *diikuti oleh !.bash*dalam file .gitignore
user5359531
1
Anda mungkin perlu *.*di windows - lihat jawabannya oleh @Smaranjit Maiti
Martin Capodici
13

Solusi terbaik untuk mencapai ini

buat .gitignorefile dalam repositori root, dan jika Anda hanya ingin memasukkan .cfile maka Anda perlu menambahkan baris di bawah ini ke .gitignorefile

*.*
!*.c

ini akan mencakup semua .cfile dari direktori dan subdirektori secara rekursif.

menggunakan

*
!*.c

tidak akan bekerja pada semua versi git.

Diuji pada

git versi 2.12.2.windows.2

Smaranjit
sumber
2
Ya saya punya masalah yang sama dengan *, dan harus digunakan *.*. Ini pada Windows menggunakan gitbash dan git versi 2.9.0.windows.1
Martin Capodici
2

Jika Anda perlu mengabaikan file tetapi bukan file tertentu di dalam direktori, berikut adalah cara saya melakukannya:

# 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
gzfrancisco
sumber
0

Terlambat ke pesta, tetapi solusi saya adalah memiliki direktori untuk file sumber dan direktori yang berbeda untuk executable dan output program, sesuatu seperti ini:

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

... dan kemudian hanya menambahkan barang src/ke dalam repositori saya dan abaikan bin/sepenuhnya.

Christian Severin
sumber