Saya mulai basah dengan Git dan memiliki masalah berikut:
Pohon sumber proyek saya:
/
|
+--src/
+----refs/
+----...
|
+--vendor/
+----...
Saya memiliki kode (saat ini MEF) di cabang vendor saya yang akan saya kompilasi di sana dan kemudian memindahkan referensi ke /src/refs
mana proyek mengambilnya.
Masalah saya adalah bahwa saya memiliki .gitignore
set saya untuk mengabaikan *.dll
dan *.pdb
. Saya dapat melakukan git add -f bar.dll
untuk memaksa penambahan file yang diabaikan yang ok, masalahnya adalah saya tidak bisa mencari tahu daftar file apa yang ada yang diabaikan.
Saya ingin membuat daftar file yang diabaikan untuk memastikan bahwa saya tidak lupa menambahkannya.
Saya telah membaca halaman manual git ls-files
dan tidak dapat membuatnya berfungsi. Sepertinya saya yang git ls-files --exclude-standard -i
harus melakukan apa yang saya inginkan. Apa yang saya lewatkan?
git clean
trik) seperti yang ditunjukkan di sini . Juga, saya sarankan terhadap contoh "kecualikan-dari" dalam ringkasan Anda karena itu sebenarnya tidak memperhatikan file .gitignore. Saya menanyakan ini terutama karena halaman ini adalah respons Google teratas.git config --global alias.ls ls-files --exclude-standard
, dan itu membuat jawaban untuk pertanyaan inigit ls -i
.Jawaban:
Catatan:
git status --ignored
.gitignore
git clean -ndX
bekerja pada gits tua, menampilkan pratinjau dari apa yang bisa dihapus file diabaikan (tanpa menghapus apa-apa)Juga menarik (disebutkan dalam qwertymk 's jawaban ), Anda juga dapat menggunakan
git check-ignore -v
perintah, setidaknya pada Unix ( tidak bekerja dalam CMD Windows sesi)Yang kedua menampilkan aturan aktual
.gitignore
yang membuat file diabaikan di repo git Anda.Di Unix, menggunakan " Apa yang diperluas ke semua file di direktori saat ini secara rekursif? " Dan bash4 +:
(atau
find -exec
perintah)Catatan: https://stackoverflow.com/users/351947/Rafi B. menyarankan dalam komentar untuk menghindari globstar (berisiko) :
Pastikan untuk mengecualikan file dari
.git/
subfolder.Jawaban asli 42009)
harus berfungsi, kecuali kode sumbernya menunjukkan:
exc_given
?Ternyata perlu satu parameter lagi setelah
-i
untuk benar-benar daftar apa pun:Mencoba:
(tapi itu hanya akan mencantumkan objek yang di- cache (tidak diabaikan), dengan filter, sehingga tidak sesuai dengan yang Anda inginkan)
Contoh:
Sebenarnya, dalam file 'gitignore' saya (disebut 'kecualikan'), saya menemukan baris perintah yang dapat membantu Anda:
Begitu....
harus melakukan trik.
Seperti disebutkan dalam halaman manual ls-file ,
--others
adalah bagian penting, untuk menunjukkan kepada Anda file yang tidak di-cache, tidak dikomit, dan biasanya diabaikan.--exclude_standard
bukan hanya jalan pintas, tetapi cara untuk memasukkan semua pengaturan "pola yang diabaikan" standar.sumber
git status --ignored
tampaknya ia juga menampilkan file yang tidak dilacakgit check-ignore -v *
berfungsi dengan baik, karena menunjukkan di mana konfigurasi diterapkan. Terima kasih.shopt -s globstar
setelah itu akan berfungsi.git check-ignore -v $(find . -type f -print)
Ada cara yang lebih sederhana untuk melakukannya (git 1.7.6+):
Lihat Apakah ada cara untuk memberi tahu status git untuk mengabaikan efek file .gitignore?
sumber
error: unknown option 'ignored'
. Bahkan menambahkan-s
seperti yang disarankan di pos tertaut tidak berfungsi.-s
. Anda dapat mencobagit status -h
melihat apakah--ignored
didukunggit clean -ndX
solusinya, karena situasi yang jarang terjadi ketika seseorang keliru melupakan bendera akan memiliki efek yang tidak dapat dibatalkan pada repositori, karena file yang tidak terlacak dihapus. Jadi itu berbahaya. Sebaliknyagit status --ignored
selalu aman, bahkan ketika salah ketik dan wajar untuk diingat.Pilihan lain yang cukup bersih (No pun intended.):
Penjelasan:
Catatan: Solusi ini tidak akan menampilkan file yang diabaikan yang telah dihapus.
sumber
make clean
dan sangat membantu pada server build.git ls-files -o -i --exclude-standard
.git clean -dXn
selalu menjadi apa yang saya inginkan tetapi tidak menunjukkan file yang diabaikan yang telah dihapus.git ls-files -o -i --exclude-standard
mungkin melakukan itu. Jadi, mungkin itulah yang menyebabkan perbedaan.n
pertama, lebih sedikit kesempatan untuk tidak sengaja menghapusnya;git clean -ndX
n
, Git default kefatal: clean.requireForce defaults to true and neither -n nor -f given; refusing to clean
. Masih cukup aman, tetapi mengetik yangn
pertama bahkan lebih aman! :)Meskipun secara umum memperbaiki solusi Anda tidak bekerja dalam semua keadaan. Asumsikan dir repo seperti ini:
dan .gitignore menyukai ini:
Ini mengabaikan
doc
direktori dan semua file di bawah initmp
. Git berfungsi seperti yang diharapkan, tetapi perintah yang diberikan untuk daftar file yang diabaikan tidak. Mari kita lihat apa yang git katakan:Perhatikan bahwa
doc
tidak ada dalam daftar. Anda bisa mendapatkannya dengan:Perhatikan
--directory
opsi tambahan .Dari pengetahuan saya tidak ada satu perintah untuk mendaftar semua file yang diabaikan sekaligus. Tapi saya tidak tahu mengapa
tmp/dir0
tidak muncul sama sekali.sumber
(git ls-files -oi --exclude-standard; git ls-files -oi --exclude-standard --directory) | perl -nle '$seen{$_}++||next;if(-d){system"find",$_,"-type","f"}else{print}'
Git sekarang memiliki fungsi ini bawaan
Tentu saja Anda dapat mengubah gumpalan menjadi sesuatu seperti
**/*.dll
dalam kasus AndaReferensi Git
sumber
git check-ignore **/*
untuk memasukkan file dalam subdirektoriItu harus cukup untuk digunakan
karena itu mencakup semua yang dicakup oleh
oleh karena itu yang terakhir adalah mubazir.
Anda dapat mempermudah ini dengan menambahkan alias ke
~/.gitconfig
file Anda :Sekarang Anda bisa mengetik
git ignored
untuk melihat daftar. Jauh lebih mudah diingat, dan lebih cepat mengetik.Jika Anda lebih suka tampilan solusi Jason Geng yang lebih ringkas, Anda dapat menambahkan alias untuk itu seperti ini:
Namun, semakin banyak keluaran verbose lebih berguna untuk mengatasi masalah dengan file .gitignore Anda, karena ini mencantumkan setiap file pemetik kapas tunggal yang diabaikan. Anda biasanya menyalurkan hasilnya
grep
untuk melihat apakah file yang Anda harapkan diabaikan ada di sana, atau jika file yang tidak ingin Anda abaikan ada di sana.Kemudian, ketika Anda hanya ingin melihat tampilan pendek, cukup mudah untuk mengingat dan mengetik
(
-s
Biasanya dapat ditinggalkan.)sumber
git status --ignored
bekerja di sisi Debian tetapi mungkin sangat baru ... tetapi tampaknya itu ditambahkan karena permintaan populer ;-)Berikut cara mencetak daftar lengkap file di pohon kerja yang cocok dengan pola yang terletak di mana saja di banyak sumber gitignore Git (jika Anda menggunakan GNU
find
):Ini akan memeriksa semua file di cabang repositori saat ini (kecuali Anda telah menghapusnya secara lokal).
Dan itu mengidentifikasi baris sumber gitignore tertentu, juga.
Git terus melacak perubahan pada beberapa file yang cocok dengan pola gitignore, hanya karena file-file itu sudah ditambahkan. Berguna, perintah di atas menampilkan file-file itu juga.
Pola gitignore negatif juga cocok. Namun, ini mudah dibedakan dalam daftar, karena mereka mulai dengan
!
.Jika Anda menggunakan Windows, Git Bash menyertakan GNU
find
(seperti yang diungkapkan olehfind --version
).Jika daftar panjang (dan sudah
rev
), Anda dapat menampilkannya dengan ekstensi (agak), juga:Untuk lebih jelasnya, lihat
man find
,man git-check-ignore
,man rev
, danman sort
.Inti dari keseluruhan pendekatan ini adalah bahwa Git (perangkat lunak) berubah dengan cepat dan sangat kompleks. Sebaliknya, GNU
find
adalah sangat stabil (setidaknya, di fitur-fiturnya yang digunakan di sini). Jadi, siapa pun yang ingin menjadi kompetitif dengan menampilkan pengetahuan mendalam mereka tentang Git akan menjawab pertanyaan dengan cara yang berbeda.Apa jawaban terbaik? Jawaban ini sengaja meminimalkan ketergantungannya pada pengetahuan Git, menuju pencapaian tujuan stabilitas dan kesederhanaan melalui modularitas (isolasi informasi), dan dirancang untuk bertahan lama .
sumber
(memperluas jawaban lain)
Catatan,
git check-ignore
gunakan yang berkomitmen.gitignore
dan bukan yang di pohon kerja Anda! Untuk memainkannya tanpa mencemari riwayat git Anda, Anda dapat dengan bebas mencoba mengeditnya, dan kemudian berkomitmen dengan agit commit --amend
.Masalah ini terjadi terutama jika Anda memerlukan penyelesaian masalah, bahwa git tidak mengikuti direktori. Masukkan di
.gitignore
:.keep
harus berupa file nol panjangdirtokeep
.Hasilnya adalah semua yang ada di dalamnya akan
dirtokeep
diabaikan, kecualidirtokeep/.keep
, yang akan menghasilkan bahwadirtokeep
direktori juga akan dibangun di clone / checkout.sumber
Dengan asumsi ada beberapa direktori abaikan, mengapa tidak menggunakan "git status node / logs" yang akan memberi tahu Anda file apa yang akan ditambahkan? Dalam direktori saya memiliki file teks yang bukan bagian dari output status, misalnya:
Pada master cabang Cabang
Anda up-to-date dengan 'asal / master'.
File yang tidak dilacak:
(gunakan "git add ..." untuk memasukkan apa yang akan dikomit)
.gitignore adalah:
*
! .gitignore
sumber