Abaikan dengan benar semua file secara rekursif di bawah folder tertentu kecuali untuk jenis file tertentu

89

Saya telah melihat pertanyaan serupa ( 1 , 2 dan 3 ), tetapi saya tidak mendapatkan solusi yang tepat dari mereka.

Saya perlu mengabaikan semua file di bawah folder tertentu kecuali untuk jenis file tertentu. Folder tersebut adalah subdirektori untuk jalur root. Biar saya beri nama foldernya Resources. Karena saya tidak ingin mempersulit banyak hal, izinkan saya mengabaikan file di bawah semua folder yang diberi nama di Resourcesmana pun itu.

Ini adalah solusi paling umum (di semua pertanyaan duplikat)

# Ignore everything
*

# Don't ignore directories, so we can recurse into them
!*/

# Don't ignore .gitignore
!.gitignore

# Now exclude our type
!*.foo

Masalah dengan solusi ini adalah ia berhenti melacak file yang baru ditambahkan (karena *mengabaikan semua file). Saya tidak ingin terus mengecualikan setiap jenis file. Saya ingin perilaku normal di mana jika ada file baru yang ditambahkan, git statustunjukkan.

Saya akhirnya mendapat solusi di sini . Solusinya adalah menambahkan .gitignorefile lain ke dalam Resourcesfolder. Ini bekerja dengan benar.

Bisakah saya mencapai hal yang sama dengan satu file abaikan? Saya menemukan banyak mengabaikan file dalam direktori yang berbeda agak kikuk.

Inilah yang saya coba capai:

# Ignore everything under Resources folder, not elsewhere
Resources

# Don't ignore directories, so we can recurse into them
!*Resources/

# Now exclude our type
!*.foo

Tapi ini memberikan hasil yang berlawanan. Ini mengabaikan *.foojenis dan melacak file lain.

nawfal
sumber

Jawaban:

108

@Sang_Angin benar.

Sejak git 1.8.2, Resources/** !Resources/**/*.fooberfungsi.

Jim G.
sumber
1
Ini berfungsi untuk saya, sedikit tweak, saya hanya perlu menghapus direktori dan semua yang ada di bawahnya jadi saya lakukan: DirectoryName1/** DirectoryName1/**/*untuk masing-masing. Pertama menghapus direktori tetapi Anda membutuhkan yang kedua untuk menghapus semua jenis file.
Penggemar Scala
27

Jawaban terbaik adalah dengan menambahkan file Resources / .gitignore di bawah Resources yang berisi:

# Ignore any file in this directory except for this file and *.foo files
*
!/.gitignore
!*.foo

Jika Anda tidak mau atau tidak dapat menambahkan file .gitignore itu, ada solusi yang tidak elegan:

# Ignore any file but *.foo under Resources. Update this if we add deeper directories
Resources/*
!Resources/*/
!Resources/*.foo
Resources/*/*
!Resources/*/*/
!Resources/*/*.foo
Resources/*/*/*
!Resources/*/*/*/
!Resources/*/*/*.foo
Resources/*/*/*/*
!Resources/*/*/*/*/
!Resources/*/*/*/*.foo

Anda perlu mengedit pola itu jika Anda menambahkan direktori lebih dalam dari yang ditentukan.

Ben Martin
sumber
2
Itu menyedihkan .. Memang saya akan memiliki direktori yang lebih dalam, jadi saya akan tetap menggunakan yang pertama :(
nawfal
Lihat detail lebih lanjut tentang solusi yang sama di sini: stackoverflow.com/questions/7803689/… - juga ditautkan di atas oleh OP @nawfal
sini
7

Ini mungkin terlihat bodoh, tetapi periksa apakah Anda belum menambahkan folder / file yang ingin Anda abaikan ke indeks sebelumnya. Jika Anda melakukannya, tidak peduli apa yang Anda masukkan ke dalam file .gitignore Anda, folder / file tersebut akan tetap dipentaskan.

Tiago
sumber
5
Jika seseorang mengalami kasus penggunaan khusus ini, Anda dapat menggunakan git rm --cached <path to files>untuk menghapus file yang diabaikan tersebut dari git sambil tetap membiarkannya di sistem file.
slothluvchunk
5

Entah saya salah melakukannya, atau jawaban yang diterima tidak lagi berfungsi dengan git saat ini.

Saya sebenarnya telah menemukan solusi yang tepat dan mempostingnya di bawah pertanyaan yang hampir sama di sini . Untuk lebih jelasnya kunjungi sana.

Larutan:

# Ignore everything inside Resources/ directory
/Resources/**
# Except for subdirectories(won't be committed anyway if there is no committed file inside)
!/Resources/**/
# And except for *.foo files
!*.foo
Aleksander Stelmaczonek
sumber
2
Ya, ini berhasil untuk saya. Menambahkan !/Resources/**/itu sangat penting agar git tidak mengabaikan subdirektori.
Johnster