Git: hanya daftar file "tidak terlacak" (juga, perintah khusus)


339

Apakah ada cara untuk menggunakan perintah seperti git ls-fileshanya menampilkan file yang tidak dilacak?

Alasan saya bertanya adalah karena saya menggunakan perintah berikut untuk memproses semua file yang dihapus:

git ls-files -d | xargs git rm

Saya ingin sesuatu yang serupa untuk file yang tidak dilacak:

git some-command --some-options | xargs git add

Saya dapat menemukan -oopsi untuk git ls-files, tetapi ini bukan yang saya inginkan karena juga menunjukkan file yang diabaikan. Saya juga bisa menghasilkan perintah panjang dan jelek berikut ini:

git status --porcelain | grep '^??' | cut -c4- | xargs git add

Sepertinya harus ada perintah yang lebih baik yang bisa saya gunakan di sini. Dan jika tidak ada, bagaimana cara membuat perintah custom git?


Bisakah Anda menguraikan mengapa Anda perlu git ls-files -d | xargs git rm?
takeshin

Itu menghapus semua file yang git pemberitahuan hilang. Pertanyaan saya adalah tentang bagaimana melakukan operasi terkait - tambahkan semua file yang git tidak lacak saat ini. Saya biasanya akan melakukan keduanya setelah mengganti nama, menggabungkan, dan / atau memisahkan file kode saya.
We Are All Monica

Jika hilang, bukankah sudah dihapus? Kecuali ... Anda menarik dari tempat lain dan kemudian Anda mencoba untuk menyinkronkan dengan remote ... Saya pikir saya mengerti.
Buttle Butkus

Saya sudah menguji semua jawaban, jika ada folder kosong yang terlacak, tidak ada yang bisa menemukannya.
kittygirl

@ Kittygirl ini benar. Karena githanya berfungsi pada file, itu tidak memiliki cara melacak folder kosong. Coba find . -type d -emptysaja.
Kita Semua Monica

Jawaban:


531

Untuk membuat daftar file yang tidak dilacak coba:

git ls-files --others --exclude-standard

Jika Anda perlu menyalurkan output ke xargs, sebaiknya perhatikan ruang putih menggunakan git ls-files -zdan xargs -0:

git ls-files -z -o --exclude-standard | xargs -0 git add

Alias ​​yang bagus untuk menambahkan file yang tidak dilacak:

au = !git add $(git ls-files -o --exclude-standard)

Sunting: Untuk referensi: git-ls-file


7
Sempurna! Apa !artinya di awal baris alias, atau di mana itu didokumentasikan?
We Are All Monica

@takeshin Bagaimana cara mendapatkan hanya nama direktori induk? bukan subfolder. Berarti dalam file-file yang tidak terlacak ini: / P / a / file, / P / a / gambar, / P / a / / P /, ... - Saya hanya ingin daftar / P /
Dr.jacky

2
Namun dalam situasi apa Anda membutuhkan alias? git add *akan melakukan hal yang sama: tambahkan semua file yang tidak terlacak tidak termasuk standar (file yang jalurnya tercakup .gitignore)
toinetoine

1
Saya lebih suka alias saya untuk bekerja secara konsisten di semua direktori di repo (perintah ls-files hanya menampilkan file yang diubah di pohon saat ini), jadi saya punya[alias] lso = "!f() { cd $(git rev-parse --show-toplevel); git ls-files -o; }; f"
qneill

Terima kasih. Komentar yang bagus
Darth Egregious

71

Jika Anda hanya ingin menghapus file yang tidak dilacak, lakukan ini:

git clean -df

tambahkan xjika Anda juga ingin memasukkan file yang diabaikan secara khusus. Saya menggunakan git clean -dfxsebuah banyak sepanjang hari.

Anda dapat membuat custom git dengan hanya menulis sebuah skrip yang dipanggil git-whateverdan memilikinya di jalur Anda.


Jauh lebih umum bahwa saya ingin menambahkan semua file yang tidak terlacak (misalnya, setelah saya memindahkan beberapa hal). Bagaimanapun, terima kasih atas tip tentang perintah khusus. Di mana mekanisme itu didokumentasikan?
We Are All Monica

5
Lakukan git add -Aatau git add -u(tergantung mana yang lebih masuk akal bagi Anda)
Dustin

1
Komentar Anda adalah jawaban yang sebenarnya, yang juga diulangi kemudian oleh @ Mike Lococo
andho

2
dan "git clean -dfxn" untuk lari kering dengan menambahkan "n"
charo

50

git add -A -nakan melakukan apa yang Anda inginkan. -Amenambahkan semua file yang tidak dilacak ke repo, -nmembuatnya menjadi dry-runtempat add tidak dilakukan tetapi status output diberikan daftar setiap file yang akan ditambahkan.


7
Ini jawaban yang bagus! Perhatikan bahwa itu tidak termasuk file dalam .gitignorefile, yang biasanya apa yang kita inginkan, tetapi jika tidak git add -fAn,.
cdunn2001

1
Ini sepertinya jawaban terbaik.
Rob Grant

1
Ini jawaban terbaik. Secara eksplisit memberi tahu pengguna apa yang akan dilakukan (tanpa melakukannya) dan memberikan kesempatan untuk memeriksanya sebelum benar-benar menambahkannya. Sempurna. Terima kasih!
digitguy

Itu juga daftar file yang dimodifikasi.
Frank-Rene Schäfer

bagus, tapi saya mendapatkannya dibungkus: add '$file'. Sedangkan git ls-files --exclude-standard -omemberikan output telanjang, panas.
hyperpallium

28

Jawaban yang diterima crash pada nama file dengan spasi. Saya pada saat ini tidak yakin cara memperbarui perintah alias, jadi saya akan meletakkan versi yang disempurnakan di sini:

git ls-files -z -o --exclude-standard | xargs -0 git add

Saya pikir ini adalah jawaban yang benar, karena ini menyediakan jalur setiap file untuk melakukan suatu tindakan (seperti git add) pada mereka sesudahnya
Pablo Burgos

27

Semuanya sangat sederhana

Untuk mendapatkan daftar semua file yang tidak dilacak, gunakan status perintah git dengan opsi -u (--untracked-file)

git status -u

bagaimana dengan versi non-rekursif itu?
David

Sayangnya, ia juga mencantumkan file yang diabaikan melalui file .gitignore.
Plouff

8
Ini adalah satu-satunya jawaban yang menunjukkan file saya diabaikan pada awal komit, tapi aku harus menambahkan --ignoredke git status -uperintah
DN

Ini sederhana & bagus.
Eric Wang

1
Ini juga menunjukkan file yang dimodifikasi. Jadi, bukan jawaban untuk pertanyaan: hanya tampilkan file yang tidak terlacak.
Wildcard

6

Saat mencari file untuk berpotensi menambah. Output dari git showmelakukan itu tetapi juga mencakup banyak hal lainnya. Perintah berikut berguna untuk mendapatkan daftar file yang sama tetapi tanpa semua hal lainnya.

 git status --porcelain | grep "^?? " | sed -e 's/^[?]* //'

Ini berguna ketika digabungkan dalam saluran pipa untuk menemukan file yang cocok dengan pola tertentu dan kemudian menyalurkannya ke git add.

git status --porcelain | grep "^?? "  | sed -e 's/^[?]* //' | \
egrep "\.project$|\.settings$\.classfile$" | xargs -n1 git add

6

Saya tahu ini pertanyaan lama, tetapi dalam hal daftar file yang tidak terlacak saya pikir saya akan menambahkan satu lagi yang juga daftar folder yang tidak dilacak:

Anda dapat menggunakan operasi git clean dengan -n (dry run) untuk menunjukkan kepada Anda file mana yang akan dihapus (termasuk file .gitignore) dengan:

git clean -xdn

Ini memiliki keuntungan menampilkan semua file dan semua folder yang tidak dilacak. Parameter:

  • x - Memperlihatkan semua file yang tidak dilacak (termasuk diabaikan oleh git dan lainnya, seperti membangun output dll ...)
  • d - tampilkan direktori yang tidak terlacak
  • n- dan yang paling penting! - dryrun, yaitu tidak benar-benar menghapus apa pun, cukup gunakan mekanisme bersih untuk menampilkan hasilnya.

Ini bisa sedikit tidak aman untuk melakukannya seperti ini jika Anda lupa -n. Jadi saya biasanya alias di git config.


2

Semua jawaban sebelumnya yang saya periksa akan mencantumkan file yang akan dikomit juga. Berikut ini adalah solusi sederhana dan mudah yang hanya mencantumkan file yang belum di repo dan belum tunduk .gitignore.

git status --porcelain | awk '/^\?\?/ { print $2; }'

atau

git status --porcelain | grep -v '\?\?'

ini tampaknya tidak berfungsi dengan baik dengan file yang memiliki ruang dalam nama mereka
ssc

-2

Saya pikir ini akan sama dengan yang dimaksudkan oleh poster aslinya:

git add .


2
Setiap kali Anda melakukannya git/svn add ., anak kucing itu mati.
Nakilon

Heh, hanya jika Anda punya banyak cruft di salinan lokal cabang terpencil;) Buat cabang lokal dan Anda bisa git add .dengan bebas dari hukuman!
Tim Fulmer

@Nakilon, itu sebabnya Anda mengkonfigurasi .gitignoredengan benar. Masih bagus untuk dihindari git add .. Lebih baik git add -u.
Wildcard
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.