Git: dapatkah saya menyembunyikan daftar entri 'konten yang dimodifikasi' / submodul kotor dalam status, diff, dll?

123

Suatu saat (sekitar rilis 1.6.x, saya pikir) git menyadari perubahan di dalam submodul. Itu hanya mengganggu saya:

vendor status $ git | grep dimodifikasi:
# dimodifikasi: vendor / rails (konten yang dimodifikasi)
vendor $ git diff /
diff --git a / vendor / rails b / vendor / rails
--- a / vendor / rails
+++ b / vendor / rails
@@ -1 +1 @@
-Subproyek commit 046c900df27994d454b7f906caa0e4226bb42b6f
+ Komit subproyek 046c900df27994d454b7f906caa0e4226bb42b6f-dirty

Tolong hentikan?

Edit:

Oke, jadi saya punya jawaban. Sekarang saya punya pertanyaan lain:

Bisakah saya memasukkan ini ~/.gitconfig? Dari awal saya tampaknya saya tidak bisa, dan saya tidak melihat sesuatu yang menjanjikan dengan membaca sekilas tambalan. (Saya kira saya masih bisa membuat alias.)

kch
sumber
Saya melihat beberapa patch di milis git mengenai hal ini, tertanggal Juni 2010. Jadi mudah-mudahan ada rilis yang akan datang. (google untuk 'git "--ignore-submodules = dirty"')
kch
1 untuk menjelaskan mengapa pesan tersebut muncul!
dotancohen

Jawaban:

175

Bahkan ada kemungkinan untuk mengatur mode abaikan untuk setiap submodule yang ditambahkan dalam file .gitmodules.

Baru hari ini saya mengalami masalah ini dan langsung menulis artikel di blog saya tentangnya setelah menemukan solusi: Bagaimana cara mengabaikan perubahan pada git submodules

Intinya:

Setelah Anda menambahkan submodul, akan ada file bernama .gitmodulesdi root repositori Anda

Cukup tambahkan satu baris ke .gitmodulesfile itu:

[submodule "bundle/fugitive"]
    path = bundle/fugitive
    url = git://github.com/tpope/vim-fugitive.git
    ignore = dirty
NilsHaldenwang
sumber
5
+1, tetapi saya menyertakan bagian utama dari posting blog Anda ke jawaban Anda di SO: tautan eksternal Anda bisa menjadi tidak valid suatu hari nanti, berlawanan dengan jawaban SO yang akan hidup selamanya (melalui SO dumps: blog.stackoverflow.com/2009/ 06 /… )
VonC
5
Saya merasa saya perlu melakukan file .gitmodules sebelum git statusbekerja seperti yang diharapkan. Anda juga membutuhkan setidaknya 1.7.4 atau lebih baik saya percaya.
aleemb
Untuk .gitignorefile tersebut, ada versi pribadi yang disebut exclude, terletak di .git/info/, yang bukan versi yang ditangani. Apakah ada file yang sesuai untuk .gitmodulesfile tersebut, yang akan memungkinkan Anda menyembunyikan perubahan dalam submodule hanya dalam instance Anda dari repositori induk, tanpa melakukan perubahan .gitmodules?
HelloGoodbye
2
Saya tidak bisa mendapatkan ini untuk bekerja dengan submodul yang melacak cabang. Apakah tidak didukung untuk itu? `` [submodule "smstack / ansible / hosts"] path = smstack / ansible / hosts url = https: // ... branch = master ignore = dirty `` `` `
Marc Abramowitz
1
@MarcAbramowitz Saya telah menemukan masalah yang sama dengan yang saya pikirkan - apakah Anda menemukan solusi untuk ini?
Sebastian G. Marinescu
61

Ada dua jenis pemberitahuan perubahan yang dapat Anda tekan.

Yang pertama untracked contentterjadi saat Anda membuat perubahan pada submodul Anda, tetapi belum melakukannya. Repositori induk memperhatikan ini dan git statusmelaporkannya sesuai:

modified: modules/media (untracked content)

Anda dapat menekannya dengan:

[submodule "modules/media"]
   path = modules/media
   url = [email protected]:user/media.git
   ignore = dirty

Namun, setelah Anda melakukan perubahan itu, repositori induk akan sekali lagi memperhatikan dan melaporkannya sesuai:

modified:   modules/media (new commits)

Jika Anda ingin menyembunyikannya juga, Anda perlu mengabaikan allperubahan

[submodule "modules/media"]
   path = modules/media
   url = [email protected]:user/media.git
   ignore = all
aleemb
sumber
2
Untuk .gitignorefile tersebut, ada versi pribadi yang disebut exclude, terletak di .git/info/, yang bukan versi yang ditangani. Apakah ada file yang sesuai untuk .gitmodulesfile tersebut, yang akan memungkinkan Anda menyembunyikan perubahan dalam submodule hanya dalam instance Anda dari repositori induk, tanpa melakukan perubahan .gitmodules?
HelloGoodbye
1
HelloGoodbye: Jika Anda memeriksa .git / modules / $ MODULENAME / Anda akan melihat apa yang tampak sebagai direktori .git untuk modul itu. Mengubah file info / kecualikan di lokasi itu melakukan pekerjaannya.
PaulW
1
Bagian ignore = allitu berguna.
Eric Wang
53

Update: Lihat (dan upvote) nilshaldenwang 's jawaban mengenai kemungkinan untuk menambah .gitmodulesfile parameter konfigurasi untuk mengabaikan keadaan kotor dari submodule diberikan.

ignore = dirty

Jadi git 1.7.2 sudah keluar dan menyertakan --ignore-submodulesopsi untuk status.

Dari git help status:

--ignore-submodules [= <when>]
    Abaikan perubahan pada submodul saat mencari perubahan.
    <when> bisa berupa "tidak terlacak", "kotor", atau "semua", yang mana
    adalah defaultnya. Saat "untracked" digunakan, submodul are
    tidak dianggap kotor jika hanya berisi tidak terlacak
    konten (tetapi mereka masih dipindai untuk konten yang dimodifikasi).
    Menggunakan "kotor" mengabaikan semua perubahan pada pohon kerja
    submodul, hanya perubahan pada komit yang disimpan di
    superproject ditampilkan (ini adalah perilaku sebelumnya
    1.7.0). Menggunakan "semua" menyembunyikan semua perubahan pada submodul (dan
    menekan keluaran ringkasan submodul saat
    config option status.submodulesummary diatur).

Nilai yang saya inginkan adalah dirty.

git status --ignore-submodules=dirty

Saya menggunakan alias karena saya malas:

alias gst='git status --ignore-submodules=dirty'
kch
sumber
2
Karena ini adalah jawaban yang diterima, saya pikir Anda juga harus menambahkan opsi untuk menambahkan ignore=dirtyentri individu dalam .gitmodulesfile di sini.
Andriy Drozdyuk
14

Seperti yang Anda sebutkan, patch git submodule: abaikan submodul kotor untuk ringkasan dan status sedang dibuat.

Juga diumumkan dalam rilis Git 1.7.2-rc2 :

Git v1.7.2 Release Notes (draft)
================================

Updates since v1.7.1
--------------------

" git status" Belajar " --ignore-submodules" pilihan.

Berarti:

git config --global diff.ignoreSubmodules dirty

Menganggap ini sebagai opsi bukanlah pendekatan yang dipilih untuk saat ini :

Setelah rangkaian ini saya berencana untuk menambahkan opsi konfigurasi ' ignore' ke .gitmodules, yang dapat disetel untuk setiap submodul menjadi "semua", "kotor", "tidak terlacak" atau "tidak ada" (default).

" git diff" dan " git status" akan menggunakan nilai konfigurasi tersebut untuk setiap submodul.
Menggunakan " --ignore-submodule" menimpa default ini (dan parameter baru "tidak ada" akan ditambahkan di sana untuk dapat mengganti setelan konfigurasi).

Dan untuk menghindari keharusan " git submdule sync" melakukan setiap kali opsi itu berubah, saya ingin mencarinya .git/configterlebih dahulu.
Jika tidak ditemukan di sana, maka akan diambil dari .gitmodules, jika ada.

Jadi pengguna dapat menimpa pengaturan tetapi jika tidak, upstream dapat mengubahnya dengan mudah (mis. Saat submodul .gitignoretelah diperbarui sehingga " ignore=untracked" tidak lagi diperlukan lagi dapat dihapus).
Perpindahan cabang juga akan berpengaruh seketika jika ignoreentri ' ' di .gitmodulesberbeda antar cabang.


Pendekatan lain untuk membuat status git (atau perintah git apa pun) untuk mengabaikan submodul tertentu tersedia dengan Git 2.13 (Q2 2017):

git config submodule.<name>.active false

Lihat selengkapnya di " Abaikan komit baru untuk submodul git ".

VonC
sumber
Saya memperbarui pertanyaan dengan sedikit gitconfig. Hanya melakukan ping jika Anda tahu jawabannya.
kch
@kch: Saya telah memperbarui jawabannya dengan pendekatan yang saat ini diusulkan untuk menyimpan pengaturan semacam ini.
VonC
@drozzy: seperti yang Anda sebutkan di komentar Anda yang lain: " ignore = dirty"
VonC
1
@drozzy: Saya telah memilih dan menyelesaikan jawaban nilshaldenwang dengan parameter konfigurasi tambahan "ignore = dirty", saya telah mengedit jawaban resmi, menambahkan link ke postingan nilshaldenwang.
VonC
Terima kasih, tidak ada yang bersifat pribadi, tetapi saya hanya ingin jawaban yang lebih berguna di bagian atas, yang awalnya saya lewatkan!
Andriy Drozdyuk
11

Anda juga bisa menggunakan

% git config [--global] submodule.ignore dirty

untuk mengatur file submodule.ignore = dirtyAnda .git/config. --globalakan menyetel bendera abaikan di Anda ~/.gitconfigdan berlaku untuk semua repositori Anda. Tanpanya itu harus diatur .git/confighanya untuk repo Anda saat ini.

Satu-satunya dokumentasi yang dapat saya temukan tentang hal ini ada submodule.<name>.ignoredi dokumen git-config . Saya memindahkannya dari file .gitmodules ke ~ / .gitconfig saya dan itu masih berfungsi untuk saya.

kjell_
sumber
@ PawełGościcki Saya dapat mengonfirmasi bahwa ini berfungsi pada Git 2.0.0.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
6

Anda perlu menambahkan

abaikan = kotor

ke .gitmodules

Roma
sumber
Di mana dalam .gitmodules Anda menambahkannya?
Andriy Drozdyuk
@drozzy Anda menambahkannya di bawah bagian untuk setiap submodul yang ingin Anda abaikan, di mana nilai "path" dan "url" ditentukan.
jsdalton
2

Jadi git v1.7.2-rc2 memiliki apa yang saya inginkan:

$ git diff --ignore-submodules = vendor kotor
# tidak ada keluaran
$ git status --ignore-submodules = vendor kotor
# Di cabang ...
tidak ada yang perlu dilakukan (direktori kerja bersih)

Membangun git howto Anda sendiri:

# get git
git clone git://git.kernel.org/pub/scm/git/git.git git
cd git
git checkout v1.7.2-rc2

# make git. beware of setting prefix
make configure
./configure --prefix=/usr/local
make
sudo make install

# you REALLY don't want to `make doc`, use this instead
sudo make quick-install-man
sudo make quick-install-html
kch
sumber
1
Saya menghitung gits tujuh sini: git clone git://git.kernel.org/pub/scm/git/git.git git.
dotancohen
2

Saya telah menjawab pertanyaan ini di sini dengan lebih rinci.

Lari saja

git config --global diff.ignoreSubmodules dirty

untuk menambahkan opsi konfigurasi lokal untuk mengabaikan perubahan tersebut.

Devpool
sumber
1

Anda mungkin tidak ingin menambahkan ignore = dirtyuntuk .gitmodules, Anda mungkin ingin lebih selektif tentang perubahan yang Anda ingin mengabaikan.

Untuk melakukan itu, tambahkan pola ke .git/submodule_foo/bar/info/exclude, di mana submodule_foo/bar/jalur submodul.

Polanya mirip dengan pola yang akan Anda tambahkan .gitignore, dengan root menjadi direktori submodul. Misalnya, pola ini mengabaikan builddirektori di submodule submodule_foo/bar/:

# in .git/submodule_foo/bar/info/exclude:
/build/
Flimm
sumber
3
Saya pikir ini akan menyembunyikan perubahan juga saat berada di dalam submodule. Saya hanya ingin perubahan disembunyikan saat berada di luar submodule. Tidak apa-apa jika mereka muncul saat di dalam, saat saya sedang mengerjakan submodul secara aktif.
Raphael Schweikert