tło
Korzystanie z Git 1.8.1.1 w systemie Linux. Repozytorium wygląda następująco:
master
book
Podmoduł został utworzony w następujący sposób:
$ cd /path/to/master
$ git submodule add https://[email protected]/user/repo.git book
book
Modułem jest czysty:
$ cd /path/to/master/book/
$ git status
# On branch master
nothing to commit, working directory clean
Problem
Z drugiej strony wzorzec pokazuje, że dla podmodułu książki istnieją „nowe zatwierdzenia”:
$ cd /path/to/master/
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: book (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")
Git powinien całkowicie zignorować katalog podmodułów, aby master również był czysty:
$ cd /path/to/master/
$ git status
# On branch master
nothing to commit, working directory clean
Nieudana próba nr 1 - zabrudzona
Wewnątrz pliku master/.gitmodules
jest następująca, zgodnie z tą odpowiedzią :
[submodule "book"]
path = book
url = https://[email protected]/user/repo.git
ignore = dirty
Nieudana próba nr 2 - nieśledzony
Zmieniono master/.gitmodules
na następujące, zgodnie z tą odpowiedzią :
[submodule "book"]
path = book
url = https://[email protected]/user/repo.git
ignore = untracked
Nieudana próba nr 3 - showUntrackedFiles
Zredagowano master/.git/config
następujące, zgodnie z tą odpowiedzią :
[status]
showUntrackedFiles = no
Nieudana próba nr 4 - zignoruj
Dodano katalog książek do głównego pliku ignorowania:
$ cd /path/to/master/
$ echo book > .gitignore
Nieudana próba nr 5 - klon
Dodano katalog książek do wzorca w następujący sposób:
$ cd /path/to/master/
$ rm -rf book
$ git clone https://[email protected]/user/repo.git book
Pytanie
W jaki sposób book
moduł podrzędny może znajdować się we własnym katalogu master
repozytorium w repozytorium, a git może zignorować book
moduł podrzędny? Oznacza to, że nie powinny być wyświetlane następujące informacje:
#
# modified: book (new commits)
#
Jak pominąć ten komunikat podczas wykonywania git status
w repozytorium głównym?
Artykuł o pułapkach podmodułu git sugeruje, że jest to niewłaściwe użycie modułu podrzędnego?
źródło
git config submodule.<name>.active false
. Zobacz moją odpowiedź poniżejOdpowiedzi:
Aby dołączyć inne repozytorium, które nie musi być śledzone w swoim super-repozytorium, spróbuj tego:
Następnie zatwierdź.
Jak stwierdzono w artykule o pułapkach powiązanych modułów git podrzędnych :
Oznacza to, że podmoduł nie jest zapisywany przez swoją wyewidencjonowaną gałąź lub tag, ale zawsze przez określone zatwierdzenie; to zatwierdzenie (SHA) jest zapisywane w super-repozytorium (tym zawierającym podmoduł) jak zwykły plik tekstowy (jest oczywiście oznaczony jako odniesienie).
Kiedy wyewidencjonujesz inne zatwierdzenie w module podrzędnym lub dokonasz w nim nowego zatwierdzenia, super-repozytorium zobaczy, że jego wyewidencjonowany SHA uległ zmianie. Wtedy otrzymujesz
modified (new commits)
linię odgit status
.Aby to wyeliminować, możesz:
git submodule update
, co spowoduje zresetowanie modułu podrzędnego do zatwierdzenia aktualnie zapisanego w super-repozytorium (szczegóły patrz stronagit submodule
podręcznika ; lubgit add book && git commit
aby zapisać nowy SHA w super-repozytorium.Jak wspomniano w komentarzach, rozważ porzucenie modułu
book
podrzędnego: sklonuj go w super-repozytorium, jeśli śledzenie jego stanu jako część super-repozytorium nie jest konieczne.źródło
git add book && git commit
. Nie zdawałem sobie sprawy, że git może faktycznie zapewnić synchronizację dwóch repozytoriów.Po prostu biegnij:
Spowoduje to przywrócenie modułu podrzędnego do starego zatwierdzenia (określonego w repozytorium nadrzędnego) bez aktualizowania repozytorium nadrzędnego o najnowszą wersję modułu podrzędnego.
źródło
book
repozytorium? Nie sądzę, aby twoja odpowiedź miała sens w tym kontekście.Istnieją dwa rodzaje powiadomień o zmianach, które można ukryć (od git 1.7.2).
Pierwsza to nieśledzona zawartość, która ma miejsce, gdy wprowadzasz zmiany w module podrzędnym, ale jeszcze ich nie zatwierdziłeś. Repozytorium nadrzędne to zauważa, a status git zgłasza to odpowiednio:
Możesz je stłumić za pomocą:
Jednak po zatwierdzeniu tych zmian repozytorium nadrzędne ponownie zwróci uwagę i odpowiednio je zgłosi:
Jeśli chcesz je również ukryć, musisz zignorować wszystkie zmiany
źródło
ignore = all
opcję do wszystkich modułów podrzędnych. Ostatecznie niektóre moduły mają nowe zatwierdzenia, które zostały wypchnięte. Jeśli ktoś następnie sklonuje super-repozytorium, czy będzie on w starym stanie podmodułów, czy też pobierze najnowsze?git clone --recursive git@...
uzyskasz stary stan podmodułów. Aby je zaktualizować, będziesz potrzebować czegoś takiego jakgit submodule foreach "git pull"
po sklonowaniuignore = all
opcja nie ignoruje nowych zatwierdzeń podmodułu. Używam git w wersji 1.7.1. Każdy pomysł?Git 2.13 (drugi kwartał 2017 r.) Doda kolejny sposób na włączenie modułu podrzędnego, który nie musi być śledzony przez repozytorium nadrzędne.
W przypadku PO:
Zobacz zatwierdzenie 1b614c0 , zatwierdzenie 1f8d711 , zatwierdzenie bb62e0a , zatwierdzenie 3e7eaed , zatwierdzenie a086f92 (17 marca 2017 r.) I zatwierdzenie ee92ab9 , zatwierdzenie 25b31f1 , zatwierdzenie e7849a9 , zatwierdzenie 6dc9f01 , zatwierdzenie 5c2bd8b (16 marca 2017 r.) Autorstwa Brandona (
mbrandonw
) .(Scalone przez Junio C Hamano -
gitster
- w zatwierdzeniu a93dcb0 , 30 marca 2017 r.)źródło
<name>
podmoduł w istniejącym projekcie?.git/config
->[submodule "<name>"]
Odpowiedź Nevika Rehnela jest z pewnością poprawna, jeśli chodzi o to, o co pytasz: nie chciałem mieć modułu podrzędnego , jak do cholery mam wyjść z tej sytuacji ?! .
Tylko, jeśli twój
master
projekt wymaga modułubook
podrzędnego, dobrym gestem jest zachowanie go jako takiego, ponieważ w ten sposób inni użytkownicy, którzy sprawdzają twój projekt, mogą wtedy cieszyć się brakiem specjalnegogit
polecenia do uruchomienia (cóż ... jest kilka specjalnych poleceń do użycia podmoduły, ale ogólnie rzecz biorąc, zarządzanie nimi jest prostsze).W twoim przypadku dokonujesz zmian w
book
repozytorium iw pewnym momencie zatwierdzasz te zmiany. Oznacza to, że masz nowe zatwierdzenia w tym module podrzędnym, które mają nową referencję SHA1.To, co musisz zrobić w katalogu głównym, to zatwierdzić te zmiany w repozytorium głównym.
Spowoduje to zaktualizowanie odniesienia SHA1 w
master
do najnowszej wersji dostępnej wbook
repozytorium. W rezultacie to zatwierdzenie pozwala innym na pobranie wszystkichmaster
&book
repozytoriów na końcówce.W efekcie otrzymujesz jeszcze jedno zatwierdzenie za każdym razem, gdy wprowadzisz zmiany w module podrzędnym. Jest to półprzezroczyste, jeśli wprowadzisz również zmiany w niektórych plikach w
master
repozytorium, ponieważ zatwierdzisz oba w tym samym czasie.źródło
Biegać
na poziomie głównym.
źródło
git status
, co mówi. Nadal uważa, że zaszły zmiany.