Problem z dodawaniem wspólnego kodu jako submodułu git: „już istnieje w indeksie”


225

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?


Co otrzymasz, jeśli to zrobisz git ls-files --stage projectfolder?
Mark Longair,

Otrzymuję listę z całą zawartością zaczynającą się od 100644.
Vanja


8
dla mnie zrobienie git rmw istniejącym folderze pomogło: |
rogerdpack,

Odpowiedzi:


343

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 projectfolderzostał już zainscenizowany („już istnieje w indeksie”). Aby dowiedzieć się, co się tutaj dzieje, spróbuj wymienić wszystko w indeksie w tym folderze z:

git ls-files --stage projectfolder

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:

160000 d00cf29f23627fc54eb992dde6a79112677cd86c 0   projectfolder

(tj. linia rozpoczynająca się od 160000), w którym to przypadku repozytorium projectfolderzostało już dodane jako „gitlink”. Jeśli nie pojawia się na wyjściu git submodulei chcesz ponownie dodać go jako submoduł, możesz:

git rm --cached projectfolder

... aby to zrobić, a następnie:

git submodule add url_to_repo projectfolder

... aby dodać repozytorium jako submoduł.

Jednak możliwe jest również, że zobaczysz na liście wiele obiektów blob (z trybami plików 100644i 100755), co sugeruje mi, że nie skopiowałeś poprawnie plików projectfolderprzed skopiowaniem nowego repozytorium na miejsce. W takim przypadku możesz wykonać następujące czynności, aby cofnąć scenę z wszystkich tych plików:

git rm -r --cached projectfolder

... a następnie dodaj submoduł z:

git submodule add url_to_repo projectfolder

12
Dziękuję Mark za szczegółową odpowiedź. Zrobiłem „git rm -r - cached projectfolder” i próbowałem ponownie dołączyć do podmodułu. Jednak tym razem pojawia się komunikat o błędzie „folder projektu” już istnieje i nie jest poprawnym repozytorium git ”.
Vanja

3
@Vanja: Wskazuje, że projectfoldernie zawierał .gitkatalogu. Z twojego pytania brzmiało to tak, jakbyś utworzył nowe repozytorium dla projectfolderinnego miejsca i skopiował je na swoje miejsce, ale najwyraźniej tak nie było. Trzeba by projectfolderusunąć istniejące , a następnie skopiować nowe repozytorium (wraz z jego .gitkatalogiem) na miejsce przed dodaniem jako podmoduł. Lub, jeśli już wypchnąłeś go do repozytorium reprezentowanego przez url_to_repo, możesz po prostu zejść projectfolderz drogi, a następnie dodać submoduł z tego adresu URL.
Mark Longair,

niesamowite odpowiedź +1 całą drogę
abbood

To mi pomogło. Dziękuję Ci!
Evan Moran,

1
To właśnie zrobiłem, czyli 3-etapowy proces KROK 1: git rm -r - cached src / test / resources /, KROK 2: usunąłem istniejący katalog zasobów do innego miejsca, KROK 3: podmoduł git dodaj dodaj url_to_repo src / test / zasoby
vikramvi

52

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

rm -rf .git/modules/c3-pro-ios-framework/

Usuń wszelkie odniesienia do submodułu w config

vim .git/config

wprowadź opis zdjęcia tutaj

Usuń .gitmodules

rm -rf .gitmodules

Usuń go z pamięci podręcznej bez „git”

git rm --cached c3-pro-ios-framework

Dodaj submoduł

git submodule add https://github.com/chb/c3-pro-ios-framework.git

2
Świetny post, działa świetnie. Świetnie, że się z tym dzielisz, proszę pana. Naprawdę świetnie.
gabn88

1
Próbowałem wyświetlić podmoduły git submodulepo usunięciu i przed dodaniem, i to dało mi błąd, popełniłem usunięcie.
mehmet

1
Głosowałbym za tym 50 razy, gdybym mógł; właśnie uratowałeś mi dzień!
Sensei James,

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.
Torxed

To był .gitkatalog, który wciąż miał dla mnie resztki. To działało świetnie. Dziękuję Ci.
Kevin Anderson

44

Najpierw musisz usunąć repozytorium git submodułu (w tym przypadku folder projektu) dla ścieżki git.

rm -rf projectfolder

git rm -r projectfolder

a następnie dodaj submoduł

git submodule add <git_submodule_repository> projectfolder

4
git submodule add --force <git_submodule_repository>pracował dla mnie, aby zachować tę samą nazwę submodułu
Tenfrow

1
Dzięki!! Nie musiałem dodawać w folderze projektu, po prostu zmieniłem na podkatalog i stamtąd stamtąd.
Tony Fraser

32

Miał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 addpolecenia.

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:

  1. Można już klonować repozytorium rodziców.
  2. Upewnij się, że common_codekatalog nie istnieje.
  3. cd Repo
  4. git submodule add git://url_to_repo projectfolder/common_code/( Zwróć uwagę na wymagany ukośnik ).
  5. Przywrócono zdrowie psychiczne.

Mam nadzieję, że to komuś pomoże, ponieważ jest bardzo mało informacji na ten temat.


1
Krok 4 powinien się rozpocząć git submodule add, a końcowy ukośnik nie jest wymagany.
nullability

Naprawiono literówkę. Ponownie go przetestowałem, a końcowe cięcie zrobiło dla mnie różnicę. Używam Zsh, jeśli ma to jakikolwiek efekt.
niezdefiniowany

To rozwiązało mój problem (tworzenie katalogu z poleceniem dodania submodułu), dziękuję!
jackJoe

18

jeśli istnieje folder o nazwie xpod kontrolą git, chcesz dodać podmoduł o tej samej nazwie, najpierw usuń folder xi zatwierdź go .

Zaktualizował @ ujjwal-singh:

Zaangażowanie nie jest potrzebne, wystarczy inscenizacja .. git add/git rm -r


Zaangażowanie było tym, czego mi brakowało. Krótka odpowiedź, ale poprawna!
Qqwy,

3
Zaangażowanie nie jest potrzebne, wystarczy inscenizacja .. git add/gir rm -r
Ujjwal Singh

3

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 AwesomeThemerepozytorium dedykowane, próbujesz zrzucić go bezpośrednio do głównego repozytorium w taki sposób, git submodule add sites/themesaby 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/AwesomeThemekatalog, usuń go. Jeśli już dokonałeś zatwierdzeń w sites/theme/AwesomeThemekatalogu w głównym repozytorium, musisz wyczyścić całą jego historię za pomocą następującego polecenia:

git filter-branch --index-filter \
              'git rm -r --cached --ignore-unmatch sites/theme/AwesomeTheme'     HEAD

Teraz możesz biegać git submodule add git@AwesomeTheme.repowhateverurlthing sites/themes/AwesomeTheme

Ponieważ główne repozytorium nigdy wcześniej nie widziało (czyli indeksu) sites/themes/AwesomeTheme, może je teraz utworzyć.


1

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:

git submodule add url_to_repo projectfolder/common_code

Spowoduje to utworzenie pożądanej struktury folderów:

repo
|-- projectfolder
    |-- common_code

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.


0

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.


0

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.


0

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


-18

Załóżmy, że w swoim git dir zsynchronizowałeś wszystkie zmiany.

rm -rf .git 

rm -rf .gitmodules

Następnie wykonaj:

git init
git submodule add url_to_repo projectfolder

2
spowoduje to usunięcie całej historii projektu!
redbandit
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.