Ви додали vendor/plugins/open_flash_chart_2
запис "gitlink", але ніколи не визначали його як підмодуль. Ефективно ви використовуєте внутрішню функцію, яку використовує підмодуль git (записи gitlink), але ви самі не використовуєте функцію підмодуля.
Ви, мабуть, зробили щось подібне:
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
Ця остання команда - проблема. Каталог vendor/plugins/open_flash_chart_2
починається як незалежне сховище Git. Зазвичай такі підрепозиторії ігноруються, але якщо ви скажете git add явно додати його, то він створить запис gitlink, який вказує на прив'язку HEAD підрепозиторію замість додавання вмісту каталогу. Було б непогано, якби git add відмовився б створювати такі "напівмодулі".
Звичайні каталоги представлені у Git як деревні об’єкти; Деревооб'єкти дають імена та дозволи до об'єктів, які вони містять (як правило, інші об'єкти дерева та блобу - каталоги та файли відповідно). Підмодулі представлені у вигляді записів "gitlink"; Записи gitlink містять лише ім'я об'єкта (хеш) комісії HEAD підмодуля. «Вихідний сховище» для фіксації gitlink вказується у .gitmodules
файлі (і .git/config
файл після ініціалізації підмодуля).
У вас є запис, який вказує на певну комісію, не записуючи джерело сховища для цього коміту. Ви можете виправити це, зробивши свою посилання на гітлінк у відповідний підмодуль, або видаливши посилання та замінивши його "нормальним" вмістом (звичайні файли та каталоги).
Перетворіть його у належний підмодуль
Єдиний біт, який вам не вистачає, щоб правильно визначити його vendor/plugins/open_flash_chart_2
як підмодуль - це .gitmodules
файл. Зазвичай (якщо ви його ще не додали як голий запис gitlink), ви просто використовуватимете git submodule add
:
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Як ви виявили, це не спрацює, якщо шлях до індексу вже існує. Рішення полягає в тимчасовому видаленні запису gitlink з індексу та додаванні підмодуля:
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
Для цього буде використано ваше наявне підрепозиторій (тобто воно не буде повторно клонувати вихідне сховище) та встановити .gitmodules
файл, який виглядає приблизно так:
[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
Він також зробить аналогічний запис у вашому головному сховищі .git/config
(без path
налаштування).
Зробіть це, і у вас буде належний підмодуль. Коли ви клонуєте сховище (або натискаєте на GitHub і клонуєте звідти), ви зможете повторно ініціалізувати підмодуль через git submodule update --init
.
Замініть його звичайним вмістом
Наступний крок передбачає, що у вашому підрепозиторії vendor/plugins/open_flash_chart_2
немає локальної історії, яку ви хочете зберегти (тобто все, що вам цікаво, це поточне робоче дерево підрепозиторію, а не історія).
Якщо у вас є важлива локальна історія в підрепозиторії, вам слід створити резервну копію .git
каталогу підрепозиторію, перш ніж видаляти його у другій команді нижче. (Також розглянемо нижній приклад підребра git, який зберігає історію HEAD підрепозиторію).
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
Цього разу при додаванні каталогу це не підрепозиторій, тому файли будуть додані нормально. На жаль, оскільки ми видалили .git
каталог, не існує надзвичайно простого способу оновлення речей із сховища джерела.
Ви можете замість цього скористатися злиттям піддерева . Це дозволить вам легко перетягувати зміни з вихідного сховища, зберігаючи файли «плоскими» у вашому сховищі (без підмодулів). Третьою стороною мерзотник поддерево команда хороша обгортка навколо функціональності поддерево злиття.
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
Пізніше:
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
gt subtree також має --squash
опцію, яка дозволяє вам не включати історію сховища джерела у свою історію, але все ж дозволяє втягувати зміни вгору.