Bagaimana cara saya memberi tahu Git untuk mengabaikan semuanya kecuali subdirektori?

218

Saya ingin mengabaikan semua file di repositori saya kecuali yang terjadi di binsubdirektori. Saya mencoba menambahkan yang berikut ini ke .gitignore:

*
!bin/*

Ini tidak memiliki efek yang diinginkan, namun: Saya membuat file baru di dalamnya bin/, tetapi melakukan git statusmasih menunjukkan nothing to commit (working directory clean).

Ada saran?

Michael Goerz
sumber

Jawaban:

273

Ini mengabaikan file-file root & direktori-direktori root, kemudian membatalkan-mengabaikan direktori root bin:

/*
/*/
!/bin/

Dengan cara ini Anda mendapatkan semua direktori bin, termasuk subdirektori dan file-file mereka.

Tyler Laing
sumber
25
Untuk beberapa alasan ini tidak bekerja secara konsisten untuk saya. Saya memiliki dua baris /stuff/dan !/stuff/specific/, tetapi masih mengabaikan / barang / spesifik /
LB
1
@ LB-- Saya punya masalah yang sama, dan git check-ignore -vmengatakan kepada saya itu karena~/.gitignore
gurney alex
@ Gurneyalex Saya menemukan bahwa itu memperbaiki sendiri jika saya menghapus repo lokal dan mengkloningnya, itu pasti bug.
LB--
2
Apakah / * / perlu?
Alex Baker
3
Ini tidak berhasil untuk saya. Saya harus menambahkan !/bin/ke .gitignorefile root saya , tetapi kemudian saya harus menambahkan /bin/.gitignorefile dengan !*... Membuat hanya satu dari perubahan itu tidak berfungsi. Ini hanya berfungsi setelah menggabungkan kedua perubahan.
Felipe Brahm
113

Di sini cara mengabaikan semuanya kecuali satu direktori " MY_SUPER_DUPER_TEMPLATE_directory " di beberapa direktori

Struktur: / bitrix / templates / MY_SUPER_DUPER_TEMPLATE_directory

/*
!/bitrix
/bitrix/*
!/bitrix/templates
/bitrix/templates/*
!/bitrix/templates/MY_SUPER_DUPER_TEMPLATE_directory
*.DS_Store
*.gitignore
Andrii Tishchenko
sumber
1
Ini sangat berhasil untuk membatalkan paket vendor laravel yang telah saya modifikasi! Terima kasih, Anda telah menyelamatkan saya dari banyak sakit kepala
Maria Vilaró
Ini harus dipilih sebagai jawaban terbaik.
Bahman.A
63

Anda harus mengecualikan semuanya dalam perjalanan ke tujuan, tetapi Anda harus menyertakan tujuan:

Catatan: Ini adalah file pengecualian (mis. Gitignore) sehingga logikanya terbalik. Abaikan semua, kecuali direktori tsp, abaikan semua di direktori tsp, kecuali direktori src ...

/*
!/tsp
/tsp/*
!/tsp/src
/tsp/src/*
!/tsp/src/*.h
!/tsp/src/*.cpp
!/tsp/src/data.txt
!/.gitignore
nikc
sumber
11
+1 untuk prinsip menyertakan direktori, lalu, mengecualikan kontennya, lalu, termasuk sub-direktori yang diinginkan, dll. Saya akhirnya menggunakan jawaban ini pada proyek saya.
John Jesus
40

Satu-satunya masalah yang Anda miliki adalah bahwa bindirektori itu sendiri tidak cocok dengan bin/*pola sehingga git bahkan tidak mencari di bindirektori.

Ada dua solusi yang muncul dalam pikiran.

.gitignore :

*
!/bin/
!bin/*

atau

.gitignore :

*
!/bin/

bin/.gitignore :

!*

Saya lebih suka solusi kedua karena solusi pertama tidak akan berhenti mengabaikan file di bindirektori yang ada di subdirektori yang tidak dipanggil bin. Ini mungkin atau mungkin tidak masalah dalam situasi Anda.

CB Bailey
sumber
2
Tidak bekerja untuk saya. Saya harus memiliki .gitignore seperti ini untuk membuatnya berfungsi: # Ignore everything * # But not these files... !/wp-content/ !/wp-content/plugins/ !/wp-content/plugins/my_plugin/ !/wp-content/plugins/my_plugin/* Tidak ada kode blok di komentar?
xlttj
1
Jawaban Tyler memiliki solusi file tunggal yang lebih baik
Yarin
19

Dari dokumen resmi git , salah satu contoh mengatakan:

Contoh untuk mengecualikan semuanya kecuali foo / bar direktori tertentu (perhatikan / * - tanpa slash, wildcard juga akan mengecualikan semua dalam foo / bar):

$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar

Untuk penjelasan tentang slash utama: Kapan harus menggunakan slash utama di gitignore .

solstice333
sumber
Terima kasih satu juta, ini berhasil untuk saya! Perhatikan kepada orang lain bahwa urutan baris di sini penting, Anda tidak dapat memiliki! / Foo / bar sebelumnya / foo / * misalnya.
Iamsodarncool
13

Coba ikuti di versi GIT terbaru.

*
!*/
!/path/to/your/dir/**
Kirby
sumber
seharusnya benar-benar! / path / ke / dir / ** untuk baris terakhir
faham
@faham, ya, baru saja menambahkannya.
Kirby
11

Saya pikir cara yang lebih baik adalah dengan meletakkan setiap pola ke direktori git teratas dengan memulai pola dengan sebuah slash:

/*
!/public_html
!/.gitignore

Alih-alih mengabaikan semua file itu hanya akan mengabaikan file tingkat atas, bukan yang ada di direktori yang tidak ingin Anda abaikan.

Jake
sumber
8

Ini .gitignorebekerja untuk saya:

*/
/*
!bin/
Trianam
sumber
5

coba bug git yang tidak jelas ini.

!bin**/**

Semoga bermanfaat :)

Mendukung contoh bug bug git

PS: coba dulu sebelum berkomentar.

David
sumber
0

Saya harus melakukan ini baru-baru ini:

*
!sub-dir/
!sub-dir/*

Saya tidak yakin mengapa saya perlu dua baris untuk mengecualikan satu folder, tetapi inilah yang bekerja untuk saya dan makro.

Henry
sumber