Dodano vendor/plugins/open_flash_chart_2
wpis „gitlink”, ale nigdy nie zdefiniowałeś go jako podmodułu. Skutecznie używasz wewnętrznej funkcji używanej przez git submodule (wpisy gitlink), ale nie używasz samej funkcji submodułu.
Prawdopodobnie zrobiłeś coś takiego:
git clone git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
git add vendor/plugins/open_flash_chart_2
To ostatnie polecenie jest problemem. Katalog vendor/plugins/open_flash_chart_2
zaczyna się jako niezależne repozytorium Git. Zwykle takie repozytoria podrzędne są ignorowane, ale jeśli powiesz git add, aby jawnie je dodał, utworzy wpis gitlink, który wskazuje na zatwierdzenie HEAD repozytorium podrzędnego, zamiast dodawać zawartość katalogu. Byłoby miło, gdyby git add odmówił tworzenia takich „półmodułów”.
Normalne katalogi są reprezentowane jako obiekty drzewa w Git; obiekty drzewa nadają nazwy i uprawnienia do obiektów, które zawierają (zwykle inne obiekty drzewa i obiekty blob - odpowiednio katalogi i pliki). Podmoduły są reprezentowane jako wpisy „gitlink”; Wpisy gitlink zawierają tylko nazwę obiektu (hash) zatwierdzenia HEAD podmodułu. „Repozytorium źródłowe” zatwierdzenia gitlink jest określone w .gitmodules
pliku (i .git/config
pliku po zainicjowaniu modułu podrzędnego ).
To, co masz, to wpis wskazujący na określone zatwierdzenie, bez rejestrowania repozytorium źródłowego dla tego zatwierdzenia. Możesz to naprawić, zmieniając gitlink we właściwy moduł podrzędny lub usuwając gitlink i zastępując go „normalną” zawartością (zwykłe pliki i katalogi).
Zmień go w odpowiedni moduł podrzędny
Jedynym bitem, którego brakuje, aby poprawnie zdefiniować vendor/plugins/open_flash_chart_2
jako moduł podrzędny, jest .gitmodules
plik. Zwykle (jeśli nie dodałeś go jeszcze jako wpis samego gitlink), po prostu użyjesz git submodule add
:
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Jak ustaliłeś, to nie zadziała, jeśli ścieżka już istnieje w indeksie. Rozwiązaniem jest tymczasowe usunięcie wpisu gitlink z indeksu, a następnie dodanie submodułu:
git rm --cached vendor/plugins/open_flash_chart_2
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Spowoduje to wykorzystanie istniejącego repozytorium podrzędnego (tj. Nie spowoduje ponownego sklonowania repozytorium źródłowego) i przygotuje .gitmodules
plik, który wygląda następująco:
[submodule "vendor/plugins/open_flash_chart_2"]
path = vendor/plugins/open_flash_chart_2
url = git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Spowoduje to również utworzenie podobnego wpisu w głównym repozytorium .git/config
(bez path
ustawienia).
Zatwierdź to, a będziesz miał odpowiedni moduł podrzędny. Po sklonowaniu repozytorium (lub wypchnięciu do GitHub i sklonowaniu stamtąd) powinno być możliwe ponowne zainicjowanie modułu podrzędnego za pośrednictwem git submodule update --init
.
Zastąp go zwykłą treścią
Następny krok zakłada, że twoje repozytorium podrzędne w vendor/plugins/open_flash_chart_2
nie ma żadnej lokalnej historii, którą chcesz zachować (tj. Wszystko, na czym Ci zależy, to bieżące drzewo robocze repozytorium podrzędnego, a nie historia).
Jeśli masz historię lokalną w repozytorium podrzędnym, na którym Ci zależy, powinieneś wykonać kopię zapasową .git
katalogu repozytorium podrzędnego przed usunięciem go w drugim poleceniu poniżej. ( Weź również pod uwagę poniższy przykład poddrzewa git, który zachowuje historię HEAD repozytorium podrzędnego).
git rm --cached vendor/plugins/open_flash_chart_2
rm -rf vendor/plugins/open_flash_chart_2/.git # BACK THIS UP FIRST unless you are sure you have no local changes in it
git add vendor/plugins/open_flash_chart_2
Tym razem podczas dodawania katalogu nie jest to repozytorium podrzędne, więc pliki zostaną dodane normalnie. Niestety, ponieważ usunęliśmy .git
katalog, nie ma super łatwego sposobu na aktualizację repozytorium źródłowego.
Zamiast tego możesz rozważyć użycie scalania poddrzewa . Pozwoli ci to łatwo pobrać zmiany z repozytorium źródłowego, zachowując „płaskie” pliki w repozytorium (bez modułów podrzędnych). Trzecia partia- git poddrzewa komenda jest ładny otoki wokół funkcjonalności subtree seryjnej.
git rm --cached vendor/plugins/open_flash_chart_2
git commit -m'converting to subtree; please stand by'
mv vendor/plugins/open_flash_chart_2 ../ofc2.local
git subtree add --prefix=vendor/plugins/open_flash_chart_2 ../ofc2.local HEAD
#rm -rf ../ofc2.local # if HEAD was the only tip with local history
Później:
git remote add ofc2 git://github.com/korin/open_flash_chart_2_plugin.git
git subtree pull --prefix=vendor/plugins/open_flash_chart_2 ofc2 master
git subtree push --prefix=vendor/plugins/open_flash_chart_2 git@github.com:me/my_ofc2_fork.git changes_for_pull_request
Poddrzewo git ma również --squash
opcję, która pozwala uniknąć włączania historii repozytorium źródłowego do historii, ale nadal umożliwia pobieranie zmian.