git: Bagaimana cara mengabaikan semua file yang sekarang tidak dilacak?

131

Apakah ada cara praktis untuk mengabaikan semua file dan folder yang tidak dilacak dalam repositori git?
(Saya tahu tentang .gitignore.)

Jadi git statusakan memberikan hasil yang bersih lagi.

sja
sumber
Atau Anda mungkin ingin menambahkan satu * ke file .gitignore Anda. :)
vilicvane
1
Hanya *akan sangat mungkin bukan yang Anda inginkan.
sjas
Terkejut dengan begitu banyak jawaban yang salah. -u nosalah. -unobenar. -u nomencoba melakukan status pada file bernama no! The noadalah tidak argumen untuk -u. Untuk memaksa noditafsirkan sebagai argumen -u, tidak boleh ada ruang. Untuk menguji ini, lakukan touch Invaliddan membandingkan git status -uInvalidke git status -u Invalid.
Aaron McDaid

Jawaban:

251

Seperti yang sudah dikatakan, untuk mengecualikan dari status gunakan saja:

git status -uno  # must be "-uno" , not "-u no"

Jika Anda ingin mengabaikan file yang saat ini tidak terlacak secara permanen, dari root proyek Anda, luncurkan:

git status --porcelain | grep '^??' | cut -c4- >> .gitignore

Setiap panggilan selanjutnya ke git statussecara eksplisit akan mengabaikan file-file itu.

UPDATE : perintah di atas memiliki sedikit kelemahan: jika Anda tidak memiliki .gitignorefile, gitignore Anda akan mengabaikannya sendiri! Ini terjadi karena file .gitignoredibuat sebelum git status --porcelaindijalankan. Jadi, jika Anda belum memiliki .gitignorefile, saya sarankan menggunakan:

echo "$(git status --porcelain | grep '^??' | cut -c4-)" > .gitignore

Hal ini menciptakan subkulit yang melengkapi sebelum itu .gitignorefile yang dibuat.

PERINTAH MENJELASKAN karena saya mendapatkan banyak suara (terima kasih!) Saya pikir saya akan lebih baik menjelaskan sedikit perintah:

  • git status --porcelaindigunakan bukan git status --shortkarena menyatakan secara manual "Berikan output dalam format skrip yang mudah diurai. Ini mirip dengan keluaran pendek, tetapi akan tetap stabil di versi git dan terlepas dari konfigurasi pengguna." Jadi kita memiliki parseabilitas dan stabilitas;
  • grep '^??'memfilter hanya baris yang dimulai dengan ??, yang, menurut manual status git , sesuai dengan file yang tidak dilacak;
  • cut -c4- menghapus 3 karakter pertama dari setiap baris, yang memberi kita hanya jalur relatif ke file yang tidak dilacak;
  • itu | simbol pipa , yang lulus output dari perintah sebelumnya ke input dari perintah berikut;
  • yang >>dan >simbol operator redirect , yang menambahkan output dari perintah sebelumnya ke file atau menimpa / membuat file baru, masing-masing.

VARIAN LAIN bagi mereka yang lebih suka menggunakansed daripada grepdan cut, inilah cara lain:

git status --porcelain | sed -n -e 's/^?? //p' >> .gitignore
Diego
sumber
3
cut -c4- menghapus 4 karakter pertama dari setiap baris, yang memberi kita hanya jalur relatif ke file yang tidak dilacak; No. -cmenandai awal daftar nomor kolom yang akan dipotong. Dan 4- memilih garis dari kolom 4 sampai akhir, yang memotong kolom 1-3. Jadi perintah cut Anda sebenarnya menghapus 3 karakter pertama dari setiap baris. Jika Anda menghapus 4 karakter dari baris status git seperti yang untuk file ini di sini:, ?? app/views/static_pages/contact.html.erbAnda akan menghapus huruf pertama dari app. Jadi perintahnya benar, tetapi penjelasannya salah.
7stud
@ 7stud: terima kasih, Anda benar, saya telah menulis 4 karena kesalahan. Saya sudah memperbaiki jawabannya.
Diego
2
Saya sangat menghargai penjelasan perintah. Sangat menyenangkan untuk mengetahui apa yang dilakukan perintah acak yang saya salin dari internet, dan membantu kita semua belajar bagaimana menggunakan baris perintah dan git lebih baik.
Eric Fitting
1
-u notidak bekerja untuk saya. Namun -unodemikian. Saya telah memperbarui jawabannya. Ini desain aneh untuk git. Saya pada git 1.7.1
Aaron McDaid
2
@AaronMcDaid: terima kasih. Perubahannya didokumentasikan di sini , dan dibahas di sini
Diego
51

Jika Anda ingin mengabaikan file-file ini secara permanen, cara sederhana untuk menambahkannya .gitignoreadalah:

  1. Ubah ke root dari pohon git.
  2. git ls-files --others --exclude-standard >> .gitignore

Ini akan menghitung semua file di dalam direktori yang tidak dilacak, yang mungkin atau mungkin tidak seperti yang Anda inginkan.

poolie
sumber
3
Mengapa ini tidak mendapatkan banyak suara? Tidak perlu menyalurkan melalui 2 program lain!
JoelFan
4
@ JoelFan: dua alasan: 1) yang ini hanya berfungsi dari root git , sedangkan yang diterima bekerja dari setiap subdirektori, Anda hanya perlu mengubah .gitignorejalur tujuan 2) jika Anda memiliki direktori yang tidak dilacak, yang satu ini daftar masing-masing dan setiap file di dalamnya, tetapi bukan direktori yang tidak dilacak itu sendiri (sehingga Anda tidak akan mengabaikan direktori tersebut, dan dengan demikian masih bisa dilaporkan file-file yang akan datang dalam direktori tersebut sebagai tidak terlacak, sedangkan yang diterima hanya mencantumkan direktori, dan bukan file yang tidak terlacak di dalamnya. Ini adalah masalah apa yang ingin Anda lakukan, tetapi sering kali Anda hanya ingin mengabaikan keseluruhan dir
Diego
1
Terima kasih Poolie Saya menghargai perbedaan dari saran Anda karena poin yang disebutkan oleh @Diego saya mulai bekerja dengan perpustakaan file & folder dan saya tidak ingin melacak / mendorong file asli. Saya hanya ingin melacak file yang saya tambahkan atau buat kembali di perpustakaan. Menambahkan folder induk akan mengabaikan segalanya. Solusi ini / Anda menambahkan semua 1696 file dalam sekejap. xD
Chaos7703
Ini juga dapat dicapai dengan menggunakan git config status.showUntrackedFiles no.
larsch
16

Ditemukan di manual

Parameter mode digunakan untuk menentukan penanganan file yang tidak dilacak. Ini opsional: default untuk semua, dan jika ditentukan, ia harus macet ke opsi (misalnya -uno, tetapi tidak -u no).

git status -uno

sja
sumber
39
Nah, jika semua orang akan RTFM sebelum memposting, tidak ada dari kita yang akan mendapatkan rep :-)
Jenny D
4

Dua arah:

gunakan argumen "-uno" untuk git-status. Ini sebuah contoh:

[jenny@jenny_vmware:ft]$ git status
# On branch ft
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       foo
nothing added to commit but untracked files present (use "git add" to track)
[jenny@jenny_vmware:ft]$ git status -uno
# On branch ft
nothing to commit (working directory clean)

Atau Anda dapat menambahkan file dan mengarahkan ke .gitignore, dalam hal ini mereka tidak akan pernah muncul.

Jenny D
sumber
2
Cara praktis mengedit .gitignoremakhluk git status | cat >> temp && vim temp. Kemudian mengedit file sehingga beberapa baris pertama dan baris terakhir dihapus, serta trailing #dan spasi setelahnya. Lalu cat temp >> .gitignore && rm temp. Jika tidak .gitignoreada sebelumnya, mv temp .gitignoreakan dilakukan. Hal-hal buruk tetapi lebih baik daripada memperbarui .gitignoresecara manual.
sjas
1
Jawaban ini salah. Jawaban yang benar adalah -uno. Jika Anda menggunakan -u no, itu setara dengan no -u- itu akan melakukan status pada file yang disebut no(yang mungkin tidak ada) dan menggunakan -umode default . yaitu setara dengangit status no
Aaron McDaid
3

-u nojuga tidak menampilkan file yang tidak dipentaskan. -unobekerja seperti yang diinginkan dan menunjukkan tanpa panggung, tetapi bersembunyi tidak terlacak.

sepak bola
sumber
1
Bahkan ini tidak sepenuhnya benar. git status -u Xsetara dengan git status X -u( Xbukan argumen untuk -u). Ini, pada gilirannya, setara dengan git status X(karena -utanpa argumen adalah default -u). Oleh karena itu, ini hanyalah status git pada file X. Jadi, jika Xini noitu hanya mencoba untuk melakukan git status pada sebuah file yang disebut no, yang Anda mungkin tidak memiliki
Aaron McDaid
2

Jika Anda tidak menggunakan Unix seperti OS, ini akan berfungsi pada Windows menggunakan PowerShell

git status --porcelain | ?{ $_ -match "^\?\? " }| %{$_ -replace "^\?\? ",""} | Add-Content .\.gitignore

Namun, .gitignore file harus memiliki baris kosong baru, jika tidak akan menambahkan teks ke baris terakhir tidak peduli apakah itu memiliki konten.

Ini mungkin alternatif yang lebih baik:

$gi=gc .\.gitignore;$res=git status --porcelain|?{ $_ -match "^\?\? " }|%{ $_ -replace "^\?\? ", "" }; $res=$gi+$res; $res | Out-File .\.gitignore

vhanla
sumber
1

Jika Anda memiliki banyak file yang tidak dilacak, dan " gitignore" tidak ingin semuanya, perhatikan bahwa, sejak git 1.8.3 (April, 22d 2013) , git statusakan menyebutkan --untracked-files=nobahkan jika Anda tidak menambahkan opsi itu di tempat pertama!

" git status" menyarankan pengguna untuk melihat ke --untracked=noopsi penggunaan saat terlalu lama.

VONC
sumber
0

Saya datang ke sini mencoba memecahkan masalah yang sedikit berbeda. Mungkin ini akan bermanfaat bagi orang lain:

Saya membuat cabang baru feature-a. sebagai bagian dari cabang ini saya membuat direktori baru dan perlu memodifikasi .gitignore untuk menekan beberapa di antaranya. Ini sering terjadi ketika menambahkan alat baru ke proyek yang membuat berbagai folder cache. .serverless,, .terraformdll.

Sebelum saya siap untuk menggabungkan itu kembali ke master saya punya sesuatu yang lain muncul, jadi saya checkout master lagi, tapi sekaranggit status mengambil folder yang ditekan itu lagi, karena .gitignore belum digabungkan.

Jawabannya di sini sebenarnya sederhana, walaupun saya harus menemukan blog ini untuk mengetahuinya:

Cukup checkout file .gitignore dari feature-acabang

git checkout feature-a -- feature-a/.gitignore
git add .
git commit -m "update .gitignore from feature-a branch"
William George
sumber