Bagaimana cara menyingkirkan status Git yang tidak terlacak?

149

Saya sepertinya tidak bisa menyingkirkan konten yang tidak terlacak dalam submodul Git. Menjalankan git statushasil:

# Pada master cabang
# Perubahan tidak dilakukan untuk melakukan:
# (gunakan "git add ..." untuk memperbarui apa yang akan dilakukan)
# (gunakan "git checkout - ..." untuk membuang perubahan dalam direktori kerja)
# (komit atau buang konten yang tidak terlacak atau dimodifikasi dalam submodul)
#
# dimodifikasi: bundel / snipmate (konten yang tidak dilacak)
# dimodifikasi: bundel / surround (konten tidak terlacak)
# dimodifikasi: bundel / trailing-whitespace (konten tidak terlacak)
# dimodifikasi: bundel / zencoding (konten yang tidak dilacak)
#
tidak ada perubahan yang ditambahkan ke komit (gunakan "git add" dan / atau "git commit -a")

Menambahkan --ignore-submodulesparameter menyembunyikan pesan-pesan ini; tapi saya bertanya-tanya apakah ada cara untuk menghilangkan kotoran ini dengan cara yang lebih cocok dan inti.

Tomer Lichtash
sumber
3
Jawaban ini: stackoverflow.com/a/5127213/199649 membangkitkan lebih banyak opsi.
charlax

Jawaban:

95

Karena status git melaporkan konten yang tidak terlacak, cara sebenarnya untuk memiliki status bersih adalah dengan masuk ke masing-masing submodul tersebut dan:

  • tambahkan dan komit konten yang tidak terlacak,
  • atau referensi konten yang tidak terlacak dalam .gitignorespesifik untuk setiap modul.
  • atau Anda dapat menambahkan konten yang diabaikan sama dengan submodule .git/info/exclude, seperti laporan peci1 di komentar .
  • atau menambahkan kotor dengan spesifikasi submodule, sebagaimana disebutkan dalam ezraspectre 's jawaban (upvoted).

    git config -f .gitmodules submodule.<path>.ignore untracked
    
  • atau tambahkan file global .gitignore (sering ~/.gitignore-global). Suka misalnya .DS_Storeatau dalam kasus saya Carthage/Buildseperti yang dilaporkan oleh Marián Černý di komentar . Lihat .gitginorehalaman manual :

Pola yang ingin diabaikan Git oleh semua pengguna dalam semua situasi (misalnya, cadangan atau file sementara yang dihasilkan oleh editor pilihan pengguna) umumnya masuk ke file yang ditentukan oleh core.excludesFilepengguna ~/.gitconfig. Nilai standarnya adalah $XDG_CONFIG_HOME/git/ignore. Jika $XDG_CONFIG_HOMEtidak disetel atau kosong, $HOME/.config/git/ignoredigunakan sebagai gantinya.

VONC
sumber
5
+1, saya hampir siap untuk berteriak sampai saya menemukan ini ... kemudian menyadari .DS_Storefile telah secara otomatis dibuat (oleh OS X) di salah satu submodul saya, mencegah saya melakukan proyek utama. Arg! Saatnya memperbarui .gitignore...
Courtney Christensen
Menggunakan Xcode, saya juga merasa berguna untuk menambahkan * .xcuserdatad ke file .gitignore-global. Ini mencegah git dari mencoba melacak preferensi Xcode lokal.
Roy Sharon
Jika Anda tidak memiliki hak push ke submodule maka Anda tidak dapat membagikan perubahan Anda ke submodule dengan pengguna lain dari repo induk. Solusi @ quincyglenn tampaknya bekerja dalam kasus seperti itu.
Drew Noakes
1
@VonC, jawaban mana pun masuk akal tergantung pada situasi dan preferensi. Saya ingin menyoroti perbedaan di sini sebagai referensi kepada yang lain. Terima kasih banyak atas jawaban Anda mengenai Git di SO - Anda telah banyak membantu saya.
Drew Noakes
2
Anda bahkan dapat melakukannya tanpa membuat dan membuat .gitignore (yang dengan sendirinya menjadi tidak terlacak). Buka submodule .git/info/excludedan tambahkan baris abaikan di sana (berfungsi seperti .gitignore, tetapi bukan bagian dari repositori bersama).
Martin Pecka
144

Saya menemukan posting blog ini berfungsi secara keseluruhan. Dengan menambahkan ignore = dirtyopsi ke masing-masing entri dalam .gitmodulesfile.

[submodule "zen-coding-gedit3"]
    path = zen-coding-gedit3
    url = git://github.com/leafac/zen-coding-gedit3.git
    ignore = dirty
ezraspectre
sumber
Solusi pilihan saya, karena mudah diotomatisasi.
lethal-guitar
24
Layak disebutkan bahwa ignore = untrackedjuga ada, dan menunjukkan file yang dilacak yang dimodifikasi, tetapi tidak file yang tidak terlacak. Akan lebih baik jika ada pengaturan global untuk ini untuk semua submodules ...
naught101
12

Anda juga dapat pergi ke setiap dir submodule dan bertindak sebagai git yang terpisah. Sebagai contoh:

cd my/project/submodule
git status

... / dapatkan daftar file yang dimodifikasi /

git add .  //to add all of them to commit into submodule
git commit -m "message to your submodule repo"

Anda juga dapat memperbarui repo submodule jarak jauh Anda dengan

git submodule update

Lagipula

Ricardo Martins
sumber
5
Anda mungkin tidak ingin melakukannya git add .tanpa meninjau file yang dimodifikasi. Sebagian besar waktu, perubahan yang dibuat adalah .DS_Storefile yang ditambahkan - ini mungkin harus ditangkap oleh Anda .gitignore, seperti zourtney disebutkan dalam komentar pertama untuk jawabannya.
gregoltsov
Jika Anda benar-benar tidak ingin memperbarui submodul dan ingin kembali ke keadaan semula, Anda mungkin ingin menjalankannya git submodule update --force.
Tom
4

Bisa jadi karena detached HEADdi cabang submodule Anda. Jika ini masalahnya, masuk ke jalur submodule Anda (misalnya:) ./bundle/snipmate, kemudian jalankan git checkout master.

Browny Lin
sumber
2

Saya terjebak pada masalah ini kemarin, dalam sebuah proyek yang memiliki hampir 12 submodul.

git status sedang menunjukkan output.

# On branch master
# Changes not staged for commit:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#   modified:   proj1 (untracked content)
#   modified:   proj1 (modified content, untracked content)
#   ...

Untuk mengatasi kesalahan konten yang tidak terlacak, saya harus menghapus file yang tidak terlacak dari semua submodul (semuanya adalah *.pyc, *.pyofile yang dihasilkan oleh python) menggunakan a .gitignore.

Untuk menyelesaikan yang lain, saya harus menjalankan git submodule updateyang memperbarui masing-masing submodul.

mu 無
sumber
1

Dalam situasi saya, saya mengkloning modul sebagai titik awal untuk modul baru di lingkungan ZF2 saya. Apa yang dilakukan adalah meletakkan folder .git sendiri ke dalam direktori.

Solusi dalam hal ini adalah menghapus folder .git (Anda mungkin perlu menampilkan file tersembunyi untuk melihatnya).

HappyCoder
sumber
1

Ini mungkin terjadi ketika Anda memiliki .git [folder tersembunyi] lain di dalam folder tertentu ..

diubah: ./../ .. (konten yang dimodifikasi, konten yang tidak terlacak)

pastikan sub-direktori Anda tidak mengandung folder .git ini.

Jika demikian, masalahnya dapat diatasi dengan menghapus folder .git secara manual dari sub direktori.

Subrat Kumar Palhar
sumber
1

Saya lebih suka menggunakan SourceTree , jadi solusi bagi saya adalah membuka repo submodule di SourceTree yang menunjukkan kepada saya daftar semua file yang tidak terlacak. Saya kemudian mengelompokkan mereka semua kemudian menggunakan "Hapus".

Saya dapat melakukan ini karena saya tahu semua file yang tidak terlacak sebenarnya tidak diperlukan.

Glenn Lawrence
sumber
1

Ini berhasil bagi saya:

git update-index --skip-worktree <path>

Jika tidak bekerja dengan pathname, coba nama file. Beri tahu saya jika ini juga berhasil untuk Anda.

DarkCrazy
sumber
-1

Jika ini adalah masalah sementara, Anda bisa masuk ke folder submodule dan menjalankan git reset HEAD --hardtetapi Anda akan kehilangan semua perubahan Anda di dalam submodule.

daigo
sumber