Podmoduł Git dodaje: problem „lokalnie znajduje się katalog git”

193

Właściwie próbuję nauczyć się korzystać z git, w tym git submodulepodkomend. Już skonfigurowałem serwer, na którym mogę hostować, wypychać i pobierać repozytoria git przy użyciu SSH. Na tym serwerze utworzyłem główne repozytorium git „Travail”, w którym chciałbym umieścić wszystkie moje projekty jako podmoduły.

W moim repozytorium Travail dodałem już mój projekt jako podmoduł tools/libft: Jestem w stanie opracować ten podmoduł, popychać go i wyciągać.

Ale kiedy próbuję dodać kolejny podmoduł (o nazwie fdf, z fdf.git na moim serwerze), pojawia się następujący problem:

git submodule add ssh://XXX.XXX.XXX.XXX:XXXXX/opt/git/fdf.git projets/fdf

Katalog git dla 'projets / fdf' jest znaleziony lokalnie z pilotem (ami): origin ssh: //[email protected]: XXXXX / opt / git / fdf.git Jeśli chcesz ponownie użyć tego lokalnego git katalog zamiast klonować ponownie z ssh: //XXX.XXX.XXX.XXX: XXXXX / opt / git / fdf.git użyj opcji --force. Jeśli lokalny katalog git nie jest poprawnym repozytorium lub nie masz pewności, co to oznacza, wybierz inną nazwę z opcją „--name”.

W rzeczywistości nie ma podkatalogu projets/

Przeczytałem w innym wątku, którego powinienem użyć git submodule synclub edytować plik .gitmodules, w którym mógłby się zmienić adres URL repozytorium źródłowego mojego podmodułu.

Ale mój plik .gitmodules zawiera tylko informacje o moim pierwszym podmodule (tools / libft), a nie o projektach / fdf:

[submodule "tools/libft"]
    path = tools/libft
    url = ssh://[email protected]:XXXXX/opt/git/libft.git

Jako francuski student mogłem coś przeoczyć w angielskiej dokumentacji, którą posiadałem, ale szukałem i naprawdę nie rozumiem, dlaczego dostaję ten problem.

Byłbym zadowolony, gdybym znalazł rozwiązanie, ale pomocne byłoby również wyjaśnienie.

vmonteco
źródło
Mała korekta: to „repozytorium”, a nie „depozytariusz”. Naprawdę nie jest to odpowiedź, ale jeśli projekty są od siebie niezależne, byłoby lepiej, gdyby każdy projekt miał własne repo zamiast submodułów.
jcm
Dziękuję, poprawiłem. Wiem, ale chciałbym zebrać całą moją pracę w tym samym repozytorium, ale jako osobne projekty. Jest to wybór, aby utrzymać cała moja praca aktualizowany, gdy idę z domu do mojej szkoły i vice versa (i nauczyć się korzystać z tych narzędzi, jestem ciekawy;))
vmonteco
Cóż, ciekawość jest zawsze dobrym powodem! :) To jest dziwne. Czy na pewno nie dodałeś wcześniej tego podmodułu?
jcm
Nie w Travail /, i nie mam problemu z klonowaniem fdf.git w ~ /. W Travail / nie znajduję żadnych śladów fdf. just libft: /
vmonteco
5
Och, czekaj, zajrzałem /Travail/.git/modules/projets/i znalazłem fdfkatalog. Wydaje się, że nie dotyczy to działającego drzewa, ale starszych zatwierdzeń. Czy to może wygenerować problem?
vmonteco

Odpowiedzi:

443

Przyszedłem do tego postu SO próbując dodać submoduł o tej samej ścieżce co submoduł, który niedawno usunąłem.

Oto, co ostatecznie dla mnie zadziałało ( ten artykuł bardzo mi pomógł ):

Jeśli jeszcze nie uruchomiłeś git rm --cached path_to_submodule(bez końcowego ukośnika) rm -rf path_to_submodule, zrób to!

Następnie:

  1. Usuń odpowiednie linie z .gitmodulespliku. np. usuń te:

    [submodule "path_to_submodule"] path = path_to_submodule url = https://github.com/path_to_submodule

  2. Usuń odpowiednią sekcję z .git / config. np. usuń te:

    [submodule "path_to_submodule"] url = https://github.com/path_to_submodule

  3. rm -rf .git/modules/path_to_submodule

Następnie możesz w końcu:

git submodule add https://github.com/path_to_submodule

jbmilgrom
źródło
47
To było bardzo pomocne, ponieważ nie mogłem znaleźć nic, co działałoby. Kluczową różnicą w stosunku do innych sugestii był twój krok nr 3. Dzięki!
AndroidDev
8
Kroki 2 i 3 były mi potrzebne.
U007D,
8
Krok 3 był dla mnie potrzebny, ale dlaczego również istnieje tam podmoduł?
Crt,
1
Dla mnie pominąłem kroki 1 i 2 (które już zawierały prawidłowe ustawienia), a krok 3 to dla mnie naprawił. (Zrobiłem już pierwszy krok git rmi rm -rfkroki.)
Rock Lee
2
Nawet krok 3 nie działał dla mnie. Miałem tylko jeden podmoduł, więc usunąłem cały .git/modulesi skończyło się to działaniem.
ach
47

wypróbowałem rozwiązanie jbmilgrom, a konkretnie próbowałem git rm --cachei to też nie działało dla mnie, ponieważ nie było katalogu / submodułu. Dla mnie zadziałało:

  1. rm -rf .git/modules/blah
  2. git submodule add git://path.to.new

Zrobiłem to po wypróbowaniu --forceciągu git submodulepoleceń i rmwszystkich innych katalogów, popycha do opanowania etc ... katalog nie istnieje i nie ma powodu, dla pamięci podręcznej. Okazuje się, .git/modulesże właśnie tam leżał ten błąd.

pjammer
źródło
15

Być może usunąłeś go 'projets/fdf'z dysku, ale twoje repozytorium Git nadal go ma. Użyj, git rm -rf projets/fdfaby usunąć go z Gita, a następnie zatwierdzić zmiany. Następnie będziesz mógł dodać ten folder jako submoduł.

bredikhin
źródło
Udało się :) Dziękuję. Chyba popełniłem ten błąd.
vmonteco
21
Powiedziano mi, że katalog nie istnieje, kiedy to robię. Wygląda na to, że oba istnieją i nie istnieją: /
Nathan Hornby
41
@ tom-mcfarlin Na koniec Imanually usunąłem wiersze z .gitmodule i folder z .git / modules, a następnie pozwoliłem dodać nowy podmoduł. Może jest na to lepszy sposób, ale zabrakło mi czasu. Jeśli pójdziesz tą drogą, polecam zrobić dobrą kopię zapasową i proszę nie obwiniaj mnie, jeśli coś pójdzie nie tak. Powodzenia.
sparklos
5
Dziękuję, znalazłem w innym poście, aby usunąć folder z .git / modules i to działało dla mnie. Ma to sens, ponieważ tym, co powiedział błąd, był konflikt ... Po prostu nie wiedziałem o tym folderze
Tom McFarlin
10
@NathanHornby @Sparklos @TomMcFarlin - W nowszych wersjach git znajdziesz, że podmoduł git dodaje katalog do folderu .git. Na przykład, jeśli jesteś w katalogu /tmp/repo, a następnie uruchom git submodule add ../otherrepo.git, zobaczysz, że ten /tmp/repo/.git/modules/otherrepofolder istnieje. Taki był dla mnie problem. Ręcznie usunąłem ten folder z .git i wszystko działało.
Alexander Bird
13

Jeśli już usunąłeś katalog submodułu, tak jak ja, postępuj zgodnie z pozostałymi instrukcjami jbmilgrom. Kluczem jest, rm -rf .git/modules/path_to_submoduleale śmiało i najpierw wykonaj kopię zapasową całego nadrzędnego katalogu repozytoriów .

Jeśli miałeś tylko jeden submoduł, po prostu usuń .gitmodules

Dmitri R117
źródło
2

Te dwa polecenia działają dla mnie.

rm path/to/submodule -rf
rm .git/modules/path/to/module -rf
W.Perrin
źródło
To. Wydaje się, że istnieją dwa sposoby tworzenia submodułów. W jednym z nich podfolder będzie miał tylko jeden plik .git, który po prostu wskazuje katalog w superprojekcie, zaczynając od .git/modules/. Tam jest folder przechowujący repozytorium dla submodułu. Usunięcie tego repozytorium naprawiło problem, a zaakceptowana odpowiedź nie.
William Randokun