Jak wspomniano w blogu Marka Longaira Git Submodules Explained ,
Wersje 1.7.0 i nowsze programu git zawierają irytującą zmianę w zachowaniu podmodułu git.
Podmoduły są teraz uważane za brudne, jeśli zawierają zmodyfikowane pliki lub pliki nieśledzone , podczas gdy poprzednio miało to miejsce tylko wtedy, gdy HEAD w podmodule wskazywał na niewłaściwe zatwierdzenie.
Znaczenie znaku plus ( +
) w wyjściu podmodułu git zmieniło się, a kiedy pierwszy raz się z tym spotkasz, zajmie trochę czasu, aby dowiedzieć się, co się dzieje, na przykład przeglądając dzienniki zmian lub używając git bisect na git .git, aby znaleźć zmianę. Byłoby znacznie milsze dla użytkowników, aby wprowadzić inny symbol „w określonej wersji, ale brudny”.
Możesz to naprawić poprzez:
popełnianie lub cofanie zmian / zmian w każdym z twoich submodułów, przed powrotem do repozytorium nadrzędnego (gdzie diff nie powinien już zgłaszać „brudnych” plików). Aby cofnąć wszystkie zmiany w twoim module podrzędnym, po prostu cd
w katalogu głównym swojego modułu podrzędnego i wykonajgit checkout .
dotnetCarpenter komentuje , że możesz:git submodule foreach --recursive git checkout .
lub dodaj --ignore-submodules
do swojego git diff
, aby tymczasowo zignorować te „brudne” submoduły.
Nowości w wersji Git 1.7.2
Jak komentuje Noam poniżej , w tym pytaniu wspomina się, że od wersji git 1.7.2 możesz zignorować brudne submoduły za pomocą:
git status --ignore-submodules=dirty
git commit -a
bez dodawania tych zmian. Chociaż są oznaczone zM
przodu, nie trafią do twojego zatwierdzenia.git clean -id
.git submodule foreach --recursive git clean -id
(najpierw do przetestowania w kopii zapasowej;)).gitignore
. Dodanie ich tam lub do mojej globalnej listy ignorowanych naprawiło rzeczy.Również usunięcie submodułu, a następnie uruchomienie
git submodule init
igit submodule update
oczywiście załatwi sprawę, ale nie zawsze może być odpowiednie lub możliwe.źródło
Aby zignorować wszystkie nieśledzone pliki w dowolnym podmodule, użyj następującego polecenia, aby zignorować te zmiany.
Doda to następującą opcję konfiguracji do lokalnej konfiguracji git:
Więcej informacji można znaleźć tutaj
źródło
EDYCJA : Ta odpowiedź (i większość innych) jest nieaktualna; zamiast tego zobacz odpowiedź Devpoola .
Początkowo nie było żadnych opcji konfiguracyjnych, aby „
git diff --ignore-submodules
” i „git status --ignore-submodules
” globalny domyślny (ale patrz też Ustawienie domyślne flagi na git poleceń ). Alternatywą jest ustawienie domyślnejignore
opcji konfiguracji dla każdego podmodułu, który chcesz zignorować (dla obugit diff
igit status
), albo w.git/config
pliku (tylko lokalnie), albo.gitmodules
(będzie wersjonowany przez git). Na przykład:ignore = untracked
aby zignorować tylko nieśledzone pliki,ignore = dirty
aby również zignorować zmodyfikowane pliki iignore = all
zignorować również zatwierdzenia. Najwyraźniej nie ma sposobu, aby zastosować go do wszystkich podmodułów.źródło
Dzieje się tak, ponieważ wskaźnik, który masz dla submodułu, nie jest tym, co faktycznie znajduje się w katalogu submodułu. Aby to naprawić, musisz uruchomić
git submodule update
ponownie:źródło
To nie pomogło mi, ale dało mi listę plików (w moim przypadku tylko jeden), które zostały zmienione w submodule (bez mojej pomocy).
Mogłem więc przejść do podmodułu, a status git pokazał mi, że mój HEAD został odłączony -> master git checkout, status git, aby zobaczyć zmodyfikowany plik jeszcze raz, git checkout> nazwa pliku <, git pull i wszystko w porządku.
źródło
W końcu usunąłem katalog submodułu i zainicjowałem go jeszcze raz
źródło
Podmoduł może zostać oznaczony jako brudny, jeśli włączone są ustawienia trybu pliku i zmieniono uprawnienia do plików w poddrzewie podmodułu.
Aby wyłączyć tryb pliku w submodule, możesz edytować /.git/modules/path/to/your/submodule/config i dodać
Jeśli chcesz zignorować wszystkie brudne stany, możesz ustawić
ignore = dirty
właściwość w pliku /.gitmodules , ale myślę, że lepiej jest wyłączać tylko tryb pliku.źródło
W moim przypadku nie byłem pewien, co to spowodowało, ale wiedziałem, że po prostu chciałem zresetować submoduły do ich ostatniego zdalnego zatwierdzenia i zrobić to. Polegało to na połączeniu odpowiedzi z kilku różnych pytań tutaj:
git submodule update --recursive --remote --init
Źródła:
Jak przywrócić moje zmiany do submodułu git?
Łatwy sposób na pobranie najnowszych wszystkich podmodułów git
źródło