Jak pozbyć się nieśledzonego statusu submodułów Git?

149

Nie mogę pozbyć się nieśledzonej zawartości w modułach podrzędnych Git. git statusPlony bieżące :

# Na gałęzi master
# Zmiany nie są wprowadzane do zatwierdzenia:
# (użyj "git add ...", aby zaktualizować to, co zostanie zatwierdzone)
# (użyj „git checkout - ...”, aby odrzucić zmiany w katalogu roboczym)
# (zatwierdź lub odrzuć nieśledzoną lub zmodyfikowaną zawartość w modułach podrzędnych)
#
# modified: bundle / snipmate (nieśledzona zawartość)
# Modified: bundle / surround (nieśledzona zawartość)
# modified: bundle / końcowe-białe znaki (zawartość nieśledzona)
# modified: bundle / zencoding (nieśledzona zawartość)
#
żadne zmiany nie zostały dodane do zatwierdzenia (użyj „git add” i / lub „git commit -a”)

Dodanie --ignore-submodulesparametru powoduje ukrycie tych komunikatów; ale zastanawiam się, czy istnieje sposób na pozbycie się tego brudu w bardziej odpowiedni, podstawowy sposób.

Tomer Lichtash
źródło
3
Ta odpowiedź: stackoverflow.com/a/5127213/199649 wywołuje więcej opcji.
charlax

Odpowiedzi:

95

Ponieważ status git zgłasza niezamierzone treści, faktycznym sposobem uzyskania czystego statusu byłoby wejście do każdego z tych podmodułów i:

  • dodawać i zatwierdzać nieśledzone treści,
  • lub odwołaj się do nieśledzonej zawartości w .gitignorespecyficznych dla każdego modułu.
  • lub możesz dodać tę samą ignorowaną zawartość do podmodułu .git/info/exclude, co raporty peci1 w komentarzach .
  • lub dodać brudny specyfikacji submodule, jak wspomniano w ezraspectre jest odpowiedź (upvoted).

    git config -f .gitmodules submodule.<path>.ignore untracked
    
  • lub dodaj plik globalny .gitignore (często ~/.gitignore-global). Jak na przykład .DS_Storelub w moim przypadku, Carthage/Buildo czym pisał Marián Černý w komentarzach . Zobacz .gitginorestronę podręcznika :

Wzorce, które użytkownik chce, aby Git ignorował we wszystkich sytuacjach (np. Kopie zapasowe lub pliki tymczasowe generowane przez wybranego edytora użytkownika) zazwyczaj trafiają do pliku określonego przez core.excludesFileużytkownika ~/.gitconfig. Jego domyślną wartością jest $XDG_CONFIG_HOME/git/ignore. Jeśli $XDG_CONFIG_HOMEnie jest ustawiona lub pusta, $HOME/.config/git/ignorejest używana zamiast tego.

VonC
źródło
5
+1, byłem prawie gotowy krzyczeć, dopóki tego nie znalazłem ... potem zdałem sobie sprawę, że .DS_Storeplik został automatycznie utworzony (przez OS X) w jednym z moich modułów podrzędnych, uniemożliwiając mi wykonanie głównego projektu. Arg! Czas na aktualizację .gitignore...
Courtney Christensen
Używając Xcode, uznałem również za przydatne dodanie * .xcuserdatad do pliku .gitignore-global. Zapobiega to próbom śledzenia lokalnych preferencji Xcode przez git.
Roy Sharon
Jeśli nie masz uprawnień wypychania do modułu podrzędnego, nie możesz udostępniać zmian w module podrzędnym innym użytkownikom repozytorium nadrzędnego. Rozwiązanie @ quincyglenn wydaje się działać w takim przypadku.
Drew Noakes
1
@VonC, każda odpowiedź ma sens w zależności od sytuacji i preferencji. Chciałem tutaj podkreślić tę różnicę jako odniesienie do innych. A tak przy okazji, dziękuję za wiele odpowiedzi na temat Git tutaj na SO - pomogłeś mi wiele razy.
Drew Noakes
2
Możesz nawet obejść się bez zatwierdzania i tworzenia pliku .gitignore (który sam staje się nieśledzony). Otwórz podmoduł .git/info/excludei dodaj tam linie ignorowania (działa jak .gitignore, ale nie jest częścią współdzielonego repozytorium).
Martin Pecka
144

Uważam, że ten post na blogu działa ogólnie. Dodając ignore = dirtyopcję do każdego wpisu w .gitmodulespliku.

[submodule "zen-coding-gedit3"]
    path = zen-coding-gedit3
    url = git://github.com/leafac/zen-coding-gedit3.git
    ignore = dirty
ezraspectre
źródło
Moje preferowane rozwiązanie, ponieważ jest łatwo zautomatyzowane.
zabójcza gitara
24
Warto wspomnieć, że ignore = untrackedrównież istnieje i pokazuje zmodyfikowane śledzone pliki, ale nie pliki nieśledzone. Byłoby miło, gdyby istniało globalne ustawienie dla wszystkich
modułów podrzędnych
12

Możesz także przejść do katalogu każdego modułu podrzędnego i działać jako oddzielny git. Na przykład:

cd my/project/submodule
git status

... / pobiera listę zmodyfikowanych plików /

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

możesz także zaktualizować zdalne repozytorium podmodułów za pomocą

git submodule update

w sumie

Ricardo Martins
źródło
5
Prawdopodobnie nie chcesz obejść się git add .bez przeglądania zmodyfikowanych plików. W większości przypadków zmiany, które zostały wprowadzone, to dodane .DS_Storepliki - to chyba powinno zostać przez Ciebie .gitignorewyłapane, jak zourtney wspomniał w pierwszym komentarzu do odpowiedzi.
gregoltsov
Jeśli faktycznie nie chcesz aktualizować modułów podrzędnych i chcesz powrócić do pierwotnego stanu, możesz chcieć uruchomić git submodule update --force.
Tom
4

Przyczyną może być detached HEADgałąź w module podrzędnym. W takim przypadku przejdź do ścieżki modułu podrzędnego (np .:) ./bundle/snipmate, a następnie uruchom git checkout master.

Browny Lin
źródło
2

Utknąłem wczoraj w tej kwestii, w projekcie, który miał blisko 12 modułów podrzędnych.

git status pokazywał wynik.

# 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)
#   ...

Aby rozwiązać ten nieśledzonej błąd treści, musiałem usunąć nieśledzone pliki z wszystkich submodules (wszyscy byli *.pyc, *.pyopliki generowane przez pytona) przy użyciu .gitignore.

Aby rozwiązać ten drugi, musiałem uruchomić git submodule updateaktualizację każdego z podmodułów.

mu 無
źródło
1

W mojej sytuacji klonuję moduły jako punkt wyjścia dla nowego modułu w moim środowisku ZF2. To powoduje umieszczenie własnego folderu .git w katalogu.

Rozwiązaniem w tym przypadku jest usunięcie folderu .git (prawdopodobnie będziesz musiał pokazać ukryte pliki, aby go wyświetlić).

HappyCoder
źródło
1

Dzieje się tak prawdopodobnie, gdy w danym folderze znajduje się inny plik .git [ukryty folder].

zmodyfikowano: ./../ .. (zmodyfikowana treść, nieśledzona treść)

upewnij się, że twój podkatalog nie zawiera tego folderu .git.

W takim przypadku problem można rozwiązać, ręcznie usuwając folder .git z podkatalogu.

Subrat Kumar Palhar
źródło
1

Wolę używać SourceTree , więc rozwiązaniem dla mnie było otwarcie repozytorium submodułów w SourceTree, które pokazuje mi listę wszystkich nieśledzonych plików. Następnie grupowałem je wszystkie i użyłem „Usuń”.

Udało mi się to zrobić, ponieważ wiedziałem, że wszystkie nieśledzone pliki nie były w rzeczywistości potrzebne.

Glenn Lawrence
źródło
1

To zadziałało dobrze dla mnie:

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

Jeśli to nie zadziała pathname, wypróbuj nazwę pliku. Daj mi znać, jeśli to też zadziałało.

DarkCrazy
źródło
-1

Jeśli jest to problem tymczasowy, możesz przejść do folderu modułu podrzędnego i uruchomić, git reset HEAD --hardale wszystkie zmiany wprowadzone w module podrzędnym zostaną utracone.

daigo
źródło