Git: czy mogę pominąć wyświetlanie „zmodyfikowanej zawartości” / brudnych wpisów podmodułu w statusie, różnicach itp.?

123

Kiedyś (myślę, że w okolicach wersji 1.6.x) git stał się świadomy zmian w podmodułach. To tylko mnie denerwuje:

Dostawca statusu $ git | grep zmodyfikowano:
# modified: vendor / rails (zmodyfikowana zawartość)
$ git diff sprzedawca /
diff --git a / vendor / rails b / vendor / rails
--- a / vendor / rails
+++ b / vendor / rails
@@ -1 +1 @@
-Zobowiązanie podprojektu 046c900df27994d454b7f906caa0e4226bb42b6f
+ Zobowiązanie podprojektu 046c900df27994d454b7f906caa0e4226bb42b6f-brudne

Proszę, zatrzymaj to?

Edytować:

Ok, więc mam odpowiedź. Teraz mam kolejne pytanie:

Mogę to włożyć ~/.gitconfig? Z mojego inicjału wynika, że ​​nie mogę i nie widziałem nic obiecującego, przeglądając łatkę. (Myślę, że nadal mogę utworzyć alias.)

kch
źródło
Widzę kilka poprawek dotyczących tego na liście mailingowej git, datowanej na czerwiec 2010. Mam nadzieję, że pojawi się w nadchodzącym wydaniu. (google dla „git” --ignore-submodules = dirty "')
kch
+1 za wyjaśnienie, dlaczego wiadomość się pojawia!
dotancohen

Odpowiedzi:

175

Istnieje nawet możliwość ustawienia trybu ignorowania dla każdego dodanego modułu podrzędnego w pliku .gitmodules.

Właśnie dzisiaj napotkałem ten problem i od razu napisałem artykuł na swoim blogu po znalezieniu rozwiązania: Jak ignorować zmiany w podmodułach git

Istota tego:

Po dodaniu .gitmodulesmodułu podrzędnego w katalogu głównym repozytorium pojawi się plik o nazwie

Po prostu dodaj jedną linię do tego .gitmodulespliku:

[submodule "bundle/fugitive"]
    path = bundle/fugitive
    url = git://github.com/tpope/vim-fugitive.git
    ignore = dirty
NilsHaldenwang
źródło
5
+1, ale dodałem główną część twojego posta na blogu do twojej odpowiedzi na SO: twój zewnętrzny link może stracić ważność pewnego dnia, w przeciwieństwie do odpowiedzi SO, które będą żyć wiecznie (poprzez zrzuty SO: blog.stackoverflow.com/2009/ 06 /… )
VonC
5
Odkryłem, że muszę zatwierdzić plik .gitmodules, zanim git statuszadziałał zgodnie z oczekiwaniami. Wydaje mi się, że potrzebujesz przynajmniej wersji 1.7.4 lub lepszej.
aleemb
W przypadku .gitignorepliku istnieje wersja prywatna o nazwie exclude, zlokalizowana w .git/info/, która nie jest obsługiwana. Czy istnieje odpowiedni plik dla tego .gitmodulespliku, który pozwoli Ci na wstrzymanie zmian w module podrzędnym tylko w Twojej instancji repozytorium nadrzędnego, bez wprowadzania zmian w .gitmodules?
HelloGoodbye
2
Nie mogę zmusić tego do pracy z modułem podrzędnym śledzącym gałąź. Czy to nie jest obsługiwane? `` [moduł podrzędny "smstack / ansible / hosts"] path = smstack / ansible / hosts url = https: // ... branch = master ignore = dirty `` `` ``
Marc Abramowitz
1
@MarcAbramowitz Natknąłem się na ten sam problem, co myślę - czy znalazłeś jakieś rozwiązanie tego problemu?
Sebastian G. Marinescu
61

Istnieją dwa rodzaje powiadomień o zmianach, które można ukryć.

Pierwsza to untracked contentsytuacja, w której wprowadzisz zmiany w module podrzędnym, ale jeszcze ich nie zatwierdziłeś. Repozytorium nadrzędne zauważa to i odpowiednio git statusraportuje:

modified: modules/media (untracked content)

Możesz je stłumić za pomocą:

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

Jednak po zatwierdzeniu tych zmian repozytorium nadrzędne ponownie zwróci uwagę i odpowiednio je zgłosi:

modified:   modules/media (new commits)

Jeśli chcesz je również ukryć, musisz zignorować allzmiany

[submodule "modules/media"]
   path = modules/media
   url = [email protected]:user/media.git
   ignore = all
aleemb
źródło
2
W przypadku .gitignorepliku istnieje wersja prywatna o nazwie exclude, zlokalizowana w .git/info/, która nie jest obsługiwana. Czy istnieje odpowiedni plik dla tego .gitmodulespliku, który pozwoli Ci na wstrzymanie zmian w module podrzędnym tylko w Twojej instancji repozytorium nadrzędnego, bez wprowadzania zmian w .gitmodules?
HelloGoodbye
1
HelloGoodbye: Jeśli zaznaczysz .git / modules / $ MODULENAME /, zobaczysz, co wygląda na katalog .git dla tego modułu. Zmiana pliku informacji / wykluczeń w tej lokalizacji załatwia sprawę.
PaulW
1
ignore = allCzęść jest przydatna.
Eric Wang,
53

Aktualizacja: See (i upvote) nilshaldenwang „s odpowiedź odnośnie do możliwości, aby dodać do .gitmodulespliku parametr konfiguracyjny za ignorowanie stan zanieczyszczenia danym modułem.

ignore = dirty

Więc git 1.7.2 jest niedostępny i zawiera --ignore-submodulesopcję dla status.

Od git help status:

--ignore-submodules [= <when>]
    Podczas wyszukiwania zmian ignoruj ​​zmiany w modułach podrzędnych.
    <when> może być „nieśledzone”, „brudne” lub „wszystkie”, co
    jest wartością domyślną. W przypadku użycia „nieśledzonego” podmoduły są
    nie są uważane za brudne, gdy zawierają tylko nieśledzone
    zawartość (ale nadal są skanowane pod kątem zmodyfikowanej zawartości).
    Użycie „brudnych” ignoruje wszystkie zmiany w drzewie roboczym
    podmoduły, tylko zmiany w zatwierdzeniach przechowywanych w
    superprojekty są pokazane (takie było zachowanie wcześniej
    1.7.0). Użycie „all” powoduje ukrycie wszystkich zmian w modułach podrzędnych (i
    pomija dane wyjściowe podsumowań podmodułów, gdy
    config opcja status.submodulesummary jest ustawiona).

Wartość, której chcę, to dirty.

git status --ignore-submodules=dirty

Używam aliasu, ponieważ jestem leniwy:

alias gst='git status --ignore-submodules=dirty'
kch
źródło
2
Ponieważ jest to akceptowana odpowiedź, myślę, że należy tutaj dodać również opcję dodawania ignore=dirtydo poszczególnych wpisów w .gitmodulespliku.
Andriy Drozdyuk
14

Jak wspomniałeś, podmoduł łatki git: ignoruj ​​brudne moduły podrzędne dla podsumowania i statusu jest w trakcie tworzenia.

Ogłoszono również w wydaniu Git 1.7.2-rc2 :

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

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

git status” Dowiedział się „ --ignore-submodules” opcja.

Znaczenie:

git config --global diff.ignoreSubmodules dirty

Uznanie tego jako opcji nie jest dokładnie podejściem wybranym na razie :

Po tej serii planuję dodać opcję konfiguracyjną „ ignore” do .gitmodules, którą można ustawić dla każdego modułu podrzędnego na „wszystkie”, „brudne”, „nieśledzone” lub „brak” (ustawienie domyślne).

git diff” i „ git status” użyją tej wartości konfiguracyjnej dla każdego modułu podrzędnego.
Użycie „ --ignore-submodule” nadpisuje to domyślne (a nowy parametr „none” zostanie tam dodany, aby móc nadpisać ustawienia konfiguracyjne).

Aby uniknąć konieczności wykonywania „ git submdule sync” za każdym razem, gdy ta opcja się zmienia, chciałbym najpierw ją wyszukać .git/config.
Jeśli nie zostanie tam znaleziony, zostanie pobrany .gitmodules, jeśli jest obecny.

Dzięki temu użytkownicy mogą nadpisać to ustawienie, ale jeśli tego nie zrobią, nadawcy mogą je łatwo zmienić (np. Gdy moduł podrzędny .gitignorezostał zaktualizowany tak, że „ ignore=untracked” nie jest już potrzebny, można go usunąć).
Również zmiana gałęzi będzie miała natychmiastowy efekt, jeśli ignorewpis „ ” w .gitmodulesposzczególnych gałęziach jest inny.


Inne podejście do nadania statusu git (lub dowolnego polecenia git) ignorowania określonego modułu podrzędnego jest dostępne w Git 2.13 (Q2 2017):

git config submodule.<name>.active false

Zobacz więcej w „ Ignoruj ​​nowe zatwierdzenia dla modułu podrzędnego git ”.

VonC
źródło
Zaktualizowałem pytanie o trochę gitconfig. Po prostu pinguję, jeśli znasz odpowiedź.
kch
@kch: Zaktualizowałem odpowiedź o obecnie proponowane podejście do przechowywania tego rodzaju ustawień.
VonC,
@drozzy: jak wspomniałeś w swoim innym komentarzu: " ignore = dirty"
VonC
1
@drozzy: Głosowałem za i uzupełniłem odpowiedź nilshaldenwang dodatkowym parametrem konfiguracyjnym „ignore = dirty”, zredagowałem oficjalną odpowiedź, dodając link do posta nilshaldenwang.
VonC,
Dzięki, nic osobistego, ale chciałem tylko bardziej użytecznej odpowiedzi na górze, której początkowo przegapiłem!
Andriy Drozdyuk
11

Możesz także użyć

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

ustawić submodule.ignore = dirtyw .git/configpliku. --globalustawi flagę ignorowania w twoim ~/.gitconfigi zastosuje do wszystkich twoich repozytoriów. Bez tego powinno się ustawić .git/configtylko dla repozytorium, w którym aktualnie jesteś.

Jedyną dokumentacją, jaką mogę znaleźć na ten temat, jest submodule.<name>.ignoredokumentacja git-config . Przeniosłem go z pliku .gitmodules do mojego ~ / .gitconfig i nadal działa.

kjell_
źródło
@ Paweł Gościcki Potwierdzam, że działa na Git 2.0.0.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
6

Musisz dodać

ignore = brudne

do .gitmodules

rzymski
źródło
Gdzie w .gitmodules to dodajesz?
Andriy Drozdyuk
@drozzy Dodajesz go w sekcji dla każdego modułu podrzędnego, który chcesz zignorować, gdzie zdefiniowane są wartości „path” i „url”.
jsdalton
2

Więc git v1.7.2-rc2 ma to, czego chcę:

$ git diff --ignore-submodules = brudny sprzedawca
# brak wyjścia
$ git status --ignore-submodules = brudny sprzedawca
# Na gałęzi…
nic do zatwierdzenia (czysty katalog roboczy)

Tworzenie własnego git howto:

# 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
źródło
1
Liczę siedem dupki tutaj: git clone git://git.kernel.org/pub/scm/git/git.git git.
dotancohen
2

Odpowiedziałem tutaj bardziej szczegółowo na to pytanie .

Po prostu biegnij

git config --global diff.ignoreSubmodules dirty

aby dodać opcję konfiguracji lokalnej, aby zignorować te zmiany.

Devpool
źródło
1

Może nie chcieć, aby dodać ignore = dirtydo .gitmodules, może chcesz być bardziej selektywny o zmianach Państwo chcieli zignorować.

Aby to zrobić, dodaj wzorce do .git/submodule_foo/bar/info/exclude, gdziesubmodule_foo/bar/ jest ścieżką do podmodułu.

Wzorce są podobne do wzorców, do których można by dodać .gitignore, z katalogiem głównym jest katalog podmodułów. Na przykład ten wzorzec ignoruje buildkatalog w module podrzędnym submodule_foo/bar/:

# in .git/submodule_foo/bar/info/exclude:
/build/
Flimm
źródło
3
Myślę, że to ukryje zmiany również w module podrzędnym. Chcę, aby zmiany były ukryte tylko poza modułem podrzędnym. W porządku, jeśli pojawiają się w środku, kiedy aktywnie pracuję nad modułem podrzędnym.
Raphael Schweikert