Jestem nowy w Git i byłbym wdzięczny za pomoc w dodawaniu submodułów. Otrzymałem dwa projekty o wspólnym kodzie. Wspólny kod został właśnie skopiowany do dwóch projektów. Utworzyłem osobne repozytorium git dla wspólnego kodu i usunąłem go z projektów, planując dodać go jako podmoduł git.
Użyłem opcji ścieżki dodawania podmodułu git, aby określić folder:
git submodule add url_to_repo projectfolder
ale potem dostał błąd:
'projectfolder' already exists in the index"
Oto pożądana struktura mojego repozytorium:
repo
|-- projectfolder
|-- folder with common code
Możliwe jest dodanie submodułu git bezpośrednio w repozytorium lub w nowym folderze, ale nie w folderze projektu. Problem polega na tym, że naprawdę musi znajdować się w folderze projektu. Co mogę z tym zrobić i co źle zrozumiałem w opcji ścieżki dodawania modułu podrzędnego git?
git
git-submodules
Vanja
źródło
źródło
git ls-files --stage projectfolder
?git rm
w istniejącym folderze pomogło: |Odpowiedzi:
Obawiam się, że w twoim pytaniu nie ma wystarczających informacji, aby mieć pewność, co się dzieje, ponieważ nie odpowiedziałeś na moje dalsze pytanie, ale może to być pomocne w każdym przypadku.
Ten błąd oznacza, że
projectfolder
został już zainscenizowany („już istnieje w indeksie”). Aby dowiedzieć się, co się tutaj dzieje, spróbuj wymienić wszystko w indeksie w tym folderze z:Pierwsza kolumna tego wyniku powie ci, jaki typ obiektu znajduje się w indeksie w
projectfolder
. (Wyglądają jak pliki plików w systemie Unix, ale mają specjalne znaczenie w git.)Podejrzewam, że zobaczysz coś takiego:
(tj. linia rozpoczynająca się od
160000
), w którym to przypadku repozytoriumprojectfolder
zostało już dodane jako „gitlink”. Jeśli nie pojawia się na wyjściugit submodule
i chcesz ponownie dodać go jako submoduł, możesz:... aby to zrobić, a następnie:
... aby dodać repozytorium jako submoduł.
Jednak możliwe jest również, że zobaczysz na liście wiele obiektów blob (z trybami plików
100644
i100755
), co sugeruje mi, że nie skopiowałeś poprawnie plikówprojectfolder
przed skopiowaniem nowego repozytorium na miejsce. W takim przypadku możesz wykonać następujące czynności, aby cofnąć scenę z wszystkich tych plików:... a następnie dodaj submoduł z:
źródło
projectfolder
nie zawierał.git
katalogu. Z twojego pytania brzmiało to tak, jakbyś utworzył nowe repozytorium dlaprojectfolder
innego miejsca i skopiował je na swoje miejsce, ale najwyraźniej tak nie było. Trzeba byprojectfolder
usunąć istniejące , a następnie skopiować nowe repozytorium (wraz z jego.git
katalogiem) na miejsce przed dodaniem jako podmoduł. Lub, jeśli już wypchnąłeś go do repozytorium reprezentowanego przezurl_to_repo
, możesz po prostu zejśćprojectfolder
z drogi, a następnie dodać submoduł z tego adresu URL.Ręczne usunięcie submodułu wymaga kilku kroków i to zadziałało dla mnie.
Zakładając, że znajdujesz się w katalogu głównym projektu, a przykładowa nazwa modułu git to „c3-pro-ios-framework”
Usuń pliki związane z submodułem
Usuń wszelkie odniesienia do submodułu w config
Usuń .gitmodules
Usuń go z pamięci podręcznej bez „git”
Dodaj submoduł
źródło
git submodule
po usunięciu i przed dodaniem, i to dało mi błąd, popełniłem usunięcie.touch .gitmodules
(musi znajdować się w działającym drzewie, więc usunięcie go pomaga. Ale musisz je dodać ponownie). Awesome post btw. Jedyne, co tu działało..git
katalog, który wciąż miał dla mnie resztki. To działało świetnie. Dziękuję Ci.Najpierw musisz usunąć repozytorium git submodułu (w tym przypadku folder projektu) dla ścieżki git.
a następnie dodaj submoduł
źródło
git submodule add --force <git_submodule_repository>
pracował dla mnie, aby zachować tę samą nazwę submodułuMiałem ten sam problem i po wielu godzinach szukania znalazłem odpowiedź.
Błąd, który otrzymałem, był nieco inny:
<path> already exists and is not a valid git repo
(i dodany tutaj dla wartości SEO)Rozwiązaniem jest NIE utworzenie katalogu, który będzie zawierał podmoduł. Katalog zostanie utworzony jako część
git submodule add
polecenia.Ponadto oczekuje się, że argument będzie związany z katalogiem głównym repozytorium nadrzędnego, a nie katalogiem roboczym, więc uważaj na to.
Rozwiązanie dla powyższego przykładu:
common_code
katalog nie istnieje.cd Repo
git submodule add git://url_to_repo projectfolder/common_code/
( Zwróć uwagę na wymagany ukośnik ).Mam nadzieję, że to komuś pomoże, ponieważ jest bardzo mało informacji na ten temat.
źródło
git submodule add
, a końcowy ukośnik nie jest wymagany.jeśli istnieje folder o nazwie
x
pod kontrolą git, chcesz dodać podmoduł o tej samej nazwie, najpierw usuń folderx
i zatwierdź go .Zaktualizował @ ujjwal-singh:
Zaangażowanie nie jest potrzebne, wystarczy inscenizacja ..
git add
/git rm -r
źródło
git add
/gir rm -r
Aby wyjaśnić ludzkim językiem, co błąd próbuje ci powiedzieć:
Nie można utworzyć repozytorium w tym folderze, który był już śledzony w głównym repozytorium.
Na przykład: masz folder motywów o nazwie
AwesomeTheme
repozytorium dedykowane, próbujesz zrzucić go bezpośrednio do głównego repozytorium w taki sposób,git submodule add sites/themes
aby uzyskać ten"AwesomeTheme" index already exists
.Musisz tylko upewnić się, że już go nie ma
sites/themes/AwesomeTheme
śledzenia wersji w głównym repozytorium, aby można było tam utworzyć podmoduł.Aby to naprawić, w głównym repozytorium, jeśli masz pusty
sites/theme/AwesomeTheme
katalog, usuń go. Jeśli już dokonałeś zatwierdzeń wsites/theme/AwesomeTheme
katalogu w głównym repozytorium, musisz wyczyścić całą jego historię za pomocą następującego polecenia:Teraz możesz biegać
git submodule add [email protected] sites/themes/AwesomeTheme
Ponieważ główne repozytorium nigdy wcześniej nie widziało (czyli indeksu)
sites/themes/AwesomeTheme
, może je teraz utworzyć.źródło
Sprawiłem, że działało to na odwrót. Zaczynając od pustego repozytorium, dodając submoduł w nowym folderze o nazwie „folder projektu / wspólny_kod”. Następnie można było dodać kod projektu w folderze projektu. Szczegóły pokazano poniżej.
W pustym typie repo:
Spowoduje to utworzenie pożądanej struktury folderów:
Można teraz dodać więcej submodułów, a kod projektu można dodać do folderu projektu.
Nie mogę jeszcze powiedzieć, dlaczego tak się działało, a nie odwrotnie.
źródło
Nie wiem, czy to jest przydatne, chociaż miałem ten sam problem, gdy próbowałem zatwierdzić moje pliki z poziomu IntelliJ 15. W końcu otworzyłem SourceTree i tam mogłem po prostu zatwierdzić plik. Problem rozwiązany. Nie musisz wydawać żadnych fantazyjnych poleceń git. Wystarczy wspomnieć o tym na wypadek, gdyby ktoś miał ten sam problem.
źródło
Przejdź do folderu repozytorium. Usuń odpowiednie submoduły z .gitmodules. Wybierz pokaż ukryte pliki. Przejdź do folderu .git, usuń submoduły z folderu modułu i skonfiguruj.
źródło
Dzieje się tak, jeśli brakuje pliku .git w ścieżce docelowej. Zdarzyło mi się to po egzekucji
git clean -f -d
.Musiałem usunąć wszystkie foldery docelowe pokazane w wiadomości, a następnie wykonać
git submodule update --remote
źródło
Załóżmy, że w swoim git dir zsynchronizowałeś wszystkie zmiany.
Następnie wykonaj:
źródło