Cara .gitignore file secara rekursif

106

Saya mencoba menghindari pola berikut di .gitignorefile saya .

MyPrject/WebApp/Scripts/special/*.js
MyPrject/WebApp/Scripts/special/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*/*/*/*.js

Kami sudah mencoba:

MyPrject/WebApp/Scripts/special/**.js
MyPrject/WebApp/Scripts/special/**/*.js

Namun ini tidak berhasil. Ini git di Windows. Apakah ada cara yang lebih ringkas untuk melakukan ini tanpa mengulanginya?

orad
sumber

Jawaban:

116

Mulai git 1.8.2, ini:

MyPrject/WebApp/Scripts/special/**/*.js

Harus bekerja menurut jawaban ini . Ini juga berfungsi untuk saya di Windows 7 menggunakan Sourcetree 1.6.12.0 dan versi git yang diinstal (1.8.4-preview20130916).

Untuk mengabaikan setiap file dan folder di bawah direktori secara rekursif:

MyPrject/WebApp/Scripts/special/**
Sam
sumber
Bagaimana dengan sebelum git 1.8?
ashes999
1
Jika jawaban ini tidak berhasil (di Windows), tambahkan karakter /di awal. Contoh:/MyProject/WebApp/Scripts/special/**/*.js
batressc
3
Saya malu karena jawaban saya terus mendapatkan suara positif ketika secara harfiah merupakan tautan ke jawaban lain .
Sam
1
@puk: .gitignoredalam pertanyaan ini ada di root repo (direktori induk /Webapp).
lucid_dreamer
1
Jawaban Anda terlihat bagus tetapi tidak berhasil untuk saya di Windows 10 dengan git 1.9.1 karena mengabaikan semua file kecuali js dalam kasus berikut: (baris pertama) foo/bar/*/*(baris kedua) !foo/bar/**/*.jsIni hanya berfungsi untuk satu tingkat subdirektori, tetapi tidak secara rekursif.
LLL
19

Mengikuti halaman manual gitignore:

[...] git memperlakukan pola sebagai shell glob yang cocok untuk dikonsumsi oleh fnmatch (3) dengan flag FNM_PATHNAME: karakter pengganti dalam pola tidak akan cocok dengan / di nama jalur.

Jadi, ini jelas menunjukkan bahwa tidak ada cara untuk menentukan sejumlah direktori di antara dua string, seperti antara specialdan js.

Namun demikian, Anda dapat memiliki .gitignorefile per direktori, jadi mungkin dalam kasus Anda konten berikut

*.js

di tempat berikut

MyPrject/WebApp/Scripts/special/.gitignore

akan cukup?

Guillaume Lemaître
sumber
Saya dulu punya MyPrject/WebApp/Scripts/special*.jsdan itu cocok MyPrject/WebApp/Scripts/specialfile.jsjuga MyPrject/WebApp/Scripts/special/a/b/c/file.js. Namun, untuk beberapa alasan perilaku tersebut telah berubah dan solusi saya saat ini adalah mencantumkan direktori secara individual. Saya menggunakan GitHub untuk Windows.
orad
1
Misalnyafind MyPrject/WebApp/Scripts/special -type d -printf 'echo "*.js" >> %h/.gitignore\n git add %h/.gitignore\n' | sh
jthill
9

Ini bekerja untuk saya di osx.

lib64/**/__pycache__/
lib/**/__pycache__/
*.py[cod]
.ipynb_checkpoints/
**/.ipynb_checkpoints/
.DS_Store
**/.DS_Store
Jonathan
sumber
0

Coba jalankan git rm -r --cached MyPrject/WebApp/Scripts/special/ Direktori yang Anda sebutkan mungkin telah di-cache oleh git dan akan muncul di file yang tidak terlacak. Setelah mengosongkan cache, pastikan Anda telah menyebutkannya .gitignore.

Pradipta Sarma
sumber