Git abaikan sub folder

438

Saya memiliki banyak proyek dalam solusi .Net saya. Saya ingin mengecualikan semua folder "bin / Debug" dan "bin / Release" (dan isinya), tetapi masih menyertakan folder "bin" itu sendiri dan semua dll yang terkandung di dalamnya.

.gitignore dengan folder "bin /" mengabaikan "Debug" dan "Release", tetapi juga dll yang ada di folder "bin".

"bin / Debug" atau "bin / Release" dalam file .gitignore tidak mengecualikan direktori, kecuali saya sepenuhnya memenuhi syarat pola abaikan sebagai "Solusi / Proyek / bin / Debug" - yang saya tidak ingin lakukan seperti saya perlu memasukkan pola lengkap ini untuk setiap proyek dalam solusi saya, serta menambahkannya untuk setiap proyek baru yang ditambahkan.

Ada saran?

Marcel
sumber
Mengapa menambahkan DLL? Jika Anda mereferensikan DLL pihak ketiga, mungkin masuk akal untuk menambahkan folder umum yang dirujuk oleh semua proyek Anda.
Paddy
6
Paddy benar - jika itu adalah DLL pihak ketiga, mereka mungkin harus diatur jauh dari kode Anda. Bagi saya, sepertinya Anda memeriksa produk buatan Anda sendiri, yang biasanya tidak sesuai keinginan Anda. Anda menggunakan git untuk melacak informasi , yang sepenuhnya terkandung dalam kode dan membangun konfigurasi. Produknya adalah produk. Melacak mereka meminta masalah - misalnya, bagaimana jika Anda mengubah kode tetapi lupa untuk membuat dan memeriksa produk baru?
Cascabel
Saya memiliki masalah dalam mengecualikan subfolder. Sudah mencoba semuanya, termasuk sampel tepat yang ditulis di sini, tetapi tidak berhasil. Akhirnya saya menambahkan baris kosong tambahan antara pola folder, dan itu berfungsi. Mungkin masalah penyandian. Saya memiliki windows dan mengkodekan ini dalam UTF8.
RoadBump

Jawaban:

552

Sudahkah Anda mencoba wildcard?

Solution/*/bin/Debug
Solution/*/bin/Release

Dengan git versi 1.8.2, Anda juga dapat menggunakan **wildcard untuk mencocokkan dengan subdirektori level mana saja:

**/bin/Debug/
**/bin/Release/
Josh Lee
sumber
8
Ini berfungsi, kecuali jika ada sub-folder dengan proyek lain di mis Solusi / Modul / Proyek jadi untuk sekarang saya telah menambahkan / * / * / bin / Debug dan / * / * / * / bin / Debug (untuk sub folder). Sepertinya Anda harus menambahkan sub folder wildcard untuk setiap level dalam struktur direktori Anda.
Marcel
1
@ Marscel: Yah, git tentu saja tidak akan mengabaikan file yang tidak Anda beri tahu - itu mengabaikan apa pun yang cocok dengan wildcard, tidak lebih, tidak kurang.
Cascabel
Saya pikir bintang ganda akan melewati batas direktori, yaitu: / ** / bin / Debug
Trent
11
@Aras: Sayangnya, tidak.
Tuukka Mustonen
2
Ada bug di Visual Studio terkait dengan **. Harus diperbaiki sekarang. tautan
Bogac
106

Anda dapat menggunakan .gitignore di tingkat atas untuk mengabaikan semua direktori dalam proyek dengan nama yang sama. Sebagai contoh:

Debug/
Release/

Ini harus segera diperbarui sehingga terlihat ketika Anda melakukan status git. Pastikan direktori ini belum ditambahkan ke git, karena itu akan mengabaikan yang diabaikan.

Andreas
sumber
Hal yang sama dapat dilakukan dengan menambahkan pola ke $GIT_DIR/.git/info/excludefile OPs .
Tim Henigan
1
Perbedaannya adalah bahwa file .gitignore akan mengikuti kode, sehingga berlaku di mana-mana. Sedangkan file yang dikecualikan adalah lokal untuk hanya repositori Anda, artinya hanya berlaku untuk repositori tertentu. Kecuali komuter lain memiliki alasan untuk ingin melakukan direktori ini, saya akan merekomendasikan menggunakan .gitignore.
Andreas
1
Masalah lain dengan ini adalah jika Anda memiliki proyek dalam solusi Anda yang disebut Debug, yang kemudian akan diabaikan. Saya pikir solusinya adalah kombinasi dari semua jawaban dan komentar - merestrukturisasi solusi untuk menjaga dll umum atau direferensikan dalam folder yang berbeda, kemudian mengabaikan "bin /" dan / atau menggunakan wildcard.
Marcel
16
+1 Untuk komentar tentang memastikan direktori belum ditambahkan ke git. Jika sudah ditambahkan ke git, lakukan:git rm -rf DirectoryName/
levibostian
57

Pertanyaannya adalah tidak bertanya tentang mengabaikan semua subdirektori, tapi aku tidak bisa menemukan di mana saja jawaban, jadi saya akan posting: */*.

mgold
sumber
1
Adakah peluang yang bisa Anda klarifikasi? Saya sudah mencoba segala macam variasi pada ini dan tidak bisa git addmengabaikan direktori dan semua file di semua subdirektori dari direktori itu. Saya telah mencoba dirname/, dirname/*, dirname/**, dirname/*/*, bahkan putus asa dirname/*/*/*, dirname/*/*/*/*, dirname/*/*/*/*/*.
Chris
3
*/*mengabaikan semua subdirektori tetapi bukan file dalam direktori saat ini. Untuk mengabaikan subdirektori tertentu adalah penggunaan gitignore normal. dirname,, dirname/dan dirname/*semua bekerja untuk saya. Apakah ada sesuatu di direktori itu yang sudah dikomit?
mgold
Ini adalah repo baru - saya menghapus seluruh .gitdirektori di antara upaya, git initkemudian git add --all .(juga mencoba tanpa --all), menggunakan 1.9.4.msysgit.1. Setiap subdirektori yang tidak kosong di bawah direktori bernama saya ditambahkan ke indeks (diperiksa di TortoiseGit dan git status). Tidak ada garis yang relevan dalam .gitignorememulai !tetapi harus ada konflik. Dipecahkan untuk saat ini dengan menghapus folder selama add. Kira ini adalah sesuatu yang akan membutuhkan penggalian sedikit lebih banyak untuk memberikan informasi yang diperlukan untuk mendiagnosis. Terima kasih telah meyakinkan saya bahwa saya tidak salah mengerti sintaks.
Chris
Bagaimana jika saya perlu mengabaikan folder di dalam folder, tetapi bukan yang pertama? Seperti di forum / ignorethisfolder / ... tapi dia tidak mengabaikan folder yang disebut forum
Jean Carlos Racoski
Ini tidak berfungsi untuk saya dalam mengabaikan direktori yang namanya dimulai dengan titik. " /. " dan ". * / *" juga tidak berfungsi.
Tony
44

Semua jawaban di atas valid, tetapi sesuatu yang saya pikir tidak disebutkan adalah bahwa sekali Anda menambahkan file dari direktori itu ke dalam repo, Anda tidak dapat mengabaikan direktori / subdirektori yang berisi file itu (git akan mengabaikan arahan itu) ).

Untuk mengabaikan file yang sudah ditambahkan jalankan

$ git rm --cached

Jika tidak, Anda harus menghapus semua file dari direktori target repo terlebih dahulu - dan kemudian Anda dapat mengabaikan folder itu.

ajacian81
sumber
12
git rm --cached jika Anda ingin mereka tidak terlacak / tidak relevan dengan sejarah tetapi ingin menjaga file tetap utuh secara lokal.
Erik Reppen
29

Selain meletakkan entri yang benar di file .gitignore Anda, jika Anda mencoba untuk mengabaikan sesuatu yang sudah ditambahkan ke repo, Anda harus melakukan git rm -r /path/to/dirdan komit sebelum Anda menambahkan dir ke file .gitignore Anda. Kalau tidak, satu-satunya hal yang akan diabaikan git adalah arahan abaikan Anda.

MidnightJava
sumber
19

Satu-satunya cara saya mendapatkan ini untuk bekerja pada mesin saya adalah melakukannya dengan cara ini:

# Ignore all directories, and all sub-directories, and it's contents:
*/*

#Now ignore all files in the current directory 
#(This fails to ignore files without a ".", for example 
#'file.txt' works, but 
#'file' doesn't):
/*.*

#Only Include these specific directories and subdirectories:
!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/

Perhatikan bagaimana Anda harus secara eksplisit mengizinkan konten untuk setiap level yang ingin Anda sertakan. Jadi jika saya memiliki subdirektori 5 tema yang jauh di bawah, saya masih perlu menjelaskannya.

Ini dari komentar @ Yarin di sini: https://stackoverflow.com/a/5250314/1696153

Ini adalah topik yang bermanfaat:

Saya juga mencoba

*
*/*
**/**

dan **/wp-content/themes/**

atau /wp-content/themes/**/*

Tidak ada yang berhasil untuk saya. Banyak jejak dan kesalahan!

Katie
sumber
13

Untuk mengecualikan konten dan subdirektori:

**/bin/*

Untuk mengecualikan semua subdirektori tetapi mengambil konten, tambahkan "/":

**/bin/*/
A. Morel
sumber
9

Untuk mengabaikan semua subdirektori, Anda cukup menggunakan:

**/

Ini bekerja pada versi 1.8.2 dari git.

frederickjh
sumber
8

Cara umum untuk mengabaikan semua subfolder, sambil terus melacak file yang ada di /bindirektori adalah dengan menambahkan baris berikut ke file .gitignore proyek Anda:

bin/*/*

Jika Anda ingin mengabaikan hanya subfolder bernama tertentu, Anda dapat melakukan:

bin/Debug/*
bin/Release/*

nb. jika bindirektori tidak di root proyek Anda (di samping file .gitignore), maka alih-alih misalnya. bin/*/*Anda mungkin perlupath/to/bin/*/*

Nick F
sumber