Czy ignorujesz podmoduł git w swoim .gitignore, czy przesyłasz go do repozytorium?

95

Dodałem submodule do mojego projektu w project_dir/vendor/submodule_oneteraz za każdym razem uruchomić git statusdostaję modified: vendor/submodule_one (new commits).

Moje pytanie brzmi: jak najlepiej sobie z tym poradzić? Czy dodać vendor/submodule_one-folder do mojego .gitignoreprojektu, ponieważ mój główny projekt nie powinien potrzebować informacji o szczegółach mojego modułu podrzędnego ?

A może kiedy zmieniam i zatwierdzam zmiany w moim module podrzędnym, czy muszę również zatwierdzać zmiany w moim głównym projekcie?

Dopiero zaczynam z podmodułami i nie mogłem znaleźć wielu informacji poza ich konfiguracją.

sprysoft
źródło

Odpowiedzi:

82

Nie, nie musisz dodawać swojego podmodułu do swojego .gitignore: to, co rodzic zobaczy z Twojego modułu podrzędnego, to gitlink ( specjalny wpismode 160000 ).

To znaczy: każda zmiana dokonana bezpośrednio w module podrzędnym musi zakończyć się zatwierdzeniem w katalogu nadrzędnym.
W ten sposób katalog nadrzędny zapisze poprawne zatwierdzenie stanu podmodułu: tym zatwierdzeniem jest wspomniany powyżej „gitlink”;

Możesz przeczytać więcej o tej polityce w „ Git submodule update (true nature of submodules) ”.
Główną ideą podmodułów jest podejście oparte na komponentach , w którym odwołujesz się do innych repozytoriów przy określonych zatwierdzeniach. Ale jeśli zmienisz cokolwiek w tych podmodułach, musisz zaktualizować te odwołania również w repozytorium nadrzędnym.


Zauważ, że z Git 2.13 (Q2 2017), nie ignorując gitlink, nadal możesz zignorować podmoduł za pomocą:

git config submodule.<name>.active false

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


Uwaga: w przypadku Git 2.15.x / 2.16 (Q1 2018) ignorowanie modułu podrzędnego jest bardziej precyzyjne.
git status --ignored --untracked” nie zatrzymał się na drzewie roboczym oddzielnego projektu, który jest osadzony w ignorowanym katalogu i zawiera listę plików w tym innym projekcie, zamiast po prostu pokazywać sam katalog jako zignorowany.

Zobacz commit fadb482 (25 października 2017) autorstwa Johannesa Schindelina ( dscho) .
(Scalone przez Junio ​​C Hamano - gitster- w zatwierdzeniu da7996a , 6 listopada 2017 r.)

status: nie daj się zmylić podmodułami w wykluczonych katalogach

Skrupulatnie przekazujemy excludeflagę do treat_directory()funkcji, abyśmy mogli wskazać, że pliki w niej zawarte są wykluczane, a nie nieśledzone podczas rekurencji.

Ale jeszcze nie traktowaliśmy podmodułów w ten sam sposób.

Z tego powodu, git status --ignored --untrackedjeśli podmoduł submodulew gitignored tracked/pokaże moduł podrzędny w sekcji „ Untracked files”, np.

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    tracked/submodule/

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/initial.t

Zamiast tego chcielibyśmy, aby pokazywał moduł podrzędny w sekcji „ Ignored files”:

On branch master
Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/
VonC
źródło
1
Dzięki VonC, to ma sens, kiedy tak to ujmujesz.
sprysoft
10
Ta odpowiedź jest myląca, ponieważ w tytule pytania pojawia się pytanie, czy zignorować foldery podmodułów, czy nie, a ty odpowiadasz twierdząco na osobne pytanie w dalszej części pytania.
SgtPooki
1
Myślę, że teraz ma to o wiele więcej sensu i dostarcza bardzo przydatnych szczegółowych informacji.
Super
Argument dla .gitignore: Po co rejestrować plik .gitsubmodules, skoro zawarty w nim adres URL może zawierać adres URL git specyficzny dla użytkownika z parametrem nazwy użytkownika?
djangofan,
1
@djangofan pytanie (i moja odpowiedź) dotyczyło zignorowania samego folderu podmodułu (tego reprezentowanego przez gitlink). Nie chodzi o ignorowanie .gitmodulespliku. Prawdą jest, że ten jeden plik (the .gitmodules) może zawierać poświadczenia, ale jeśli jest używany tylko do klonowania publicznych repozytoriów, nie musi ich uwzględniać. Ponadto można je i tak przechowywać w pamięci podręcznej, nawet w systemie Windows, za pomocą pomocników poświadczeń, takich jak „Git Credential Manager for Windows” ( github.com/Microsoft/Git-Credential-Manager-for-Windows/… ). Tak więc posiadanie referencji .gitmodulesnie jest zgubne.
VonC,
8

Z jakiegoś powodu submodule.module-name.active nie działał dla mnie.

Dlatego użyłem submodule.module-name.ignore

git config submodule.<your module path>.ignore all

https://git-scm.com/docs/gitmodules - tutaj znajdziesz opis możliwych wartości parametru

Działa dla mnie dla (nowych zatwierdzeń) i (zmodyfikowanej treści) wiadomości.

Vladimir
źródło
1

Aby dodać do zaakceptowanej odpowiedzi, stwierdziłem, że dodanie folderu podmodułu Git do .gitignore w rzeczywistości powoduje problemy - szczególnie podczas próby utworzenia nowego klonu projektu. W szczególności uruchomienie zwykłych poleceń klonowania podmodułu spowodowało, że folder podmodułu był pusty:

git submodule init
git submodule update
git pull --recurse-submodules

Tylko próbując ponownie uruchomić

git submodule add <Git repo> <submodule folder>

na podstawie wyników było jasne, na czym polega problem:

The following path is ignored by one of your .gitignore files:
<submodule folder>
Use -f if you really want to add it.

Zamiast dodawać -f, usunąłem folder podmodułów Git z .gitignore i ponownie uruchomiłem polecenia klonowania submodułów - które teraz pomyślnie utworzyły folder. Myślę, że może być błąd w tym, że jedno z poleceń klonu submodułu respektuje .gitignore, ale nie ostrzega, że ​​odpowiednio pomija podmoduł.

Woodz
źródło