Использование Git и знание того, когда нужно обновить или зафиксировать подмодуль, который изменился
Я пытаюсь узнать, когда просто git add
/git commit
подмодуль, или submodule update
, когда я вижу (new commits)
в моем статусе.
Примечание: я в порядке, чтобы иметь окончательную версию /form
субмодуль как часть родителя, т.е. мне удобно интегрировать весь текущий статус подмодуля в родительский, если это помогает знать.
Я смотрел .gitmodules
чтобы увидеть, что у меня было:
/main$ cat .gitmodules
[submodule "xm_css/form"]
path = xm_css/form
url = https://github.com/HighgateCreative/form.css.git
II. проверил статус в подмодуле:
/main/form$ gs
HEAD detached at 1ce1544
nothing to commit, working directory clean
III. использовал один из двух методов, которые я использую, чтобы присоединить ГОЛОВКУ (хотя после обширного чтения понял, что это не обязательно):
/main/form$ git checkout -b temp
Switched to a new branch 'temp'
bradc@highsite-dev:/var/www/cms/xm_css/form$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
VI. подтолкнул к началу координат (теперь я понимаю, что это не было бы необходимо, если бы я оставил ГОЛОВУ отсоединен)
/main/form$ git push
Username for 'https://github.com': myemail@gmail.com
Password for 'https://myemail@gmail.com@github.com':
Counting objects: 10, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (10/10), 790 bytes | 0 bytes/s, done.
Total 10 (delta 4), reused 0 (delta 0)
To https://github.com/HighgateCreative/form.css.git
1ce1544..272dc7b master -> master
V. двойная проверка статуса
/form$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
VI. Появление (new commits)
во время git status
в родительском
/main$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: xm_css/form (new commits)
VIIa. Анализ начинается с git diff
:
/main$ git diff
diff --git a/xm_css/form b/xm_css/form
index 1ce1544..272dc7b 160000
--- a/xm_css/form
+++ b/xm_css/form
@@ -1 +1 @@
-Subproject commit 1ce1544db293096a740312c4ad5486dd7922085c
+Subproject commit 272dc7baebe70b75da3da00d28ba97b52099ce55
VIIb. Анализ продолжается с git log
:
/main/submodule $ git log
commit 272dc7baebe70b75da3da00d28ba97b52099ce55
Author: Brad Cathey
Date: Thu Mar 3 12:00:28 2016 -0600
trying to get buttons to display properly
commit f4141a2ec88de2efb550ec5b14426a54347312b2
Author: Brad Cathey
Date: Thu Mar 3 10:57:56 2016 -0600
adding type=button
commit 1ce1544db293096a740312c4ad5486dd7922085c
Author: John smith
Date: Tue Nov 17 08:39:18 2015 -0600
Set all 'buttons' to display inline-block
VIIc. Анализ продолжается в субмодуле git diff --submodule=log
:
/main$ git diff --submodule=log
Submodule xm_css/form 1ce1544..272dc7b:
> trying to get buttons to display properly
> adding type=button
Продумывая все это: SHA не в последовательности (мышление update
б) но >
напоследок git diff
заставил меня задуматься commit
Однако не совсем уверен в --submodule=log
вариант.
Мысли?
1 ответ
То, что вы видите в родительском репо, - это gitlink ( специальная запись в индексе), которая записывает новый SHA1 подмодуля.
Каждый раз, когда вы изменяете и фиксируете (и отправляете) содержимое субмодуля, вам также необходимо добавить, зафиксировать и отправить новый SHA1 (gitlink) этого субмодуля из родительского репо.
Этот SHA1 не обязательно должен быть в последовательности: он просто отражает, какой коммит вы выбрали для извлечения субмодуля.
git diff --submodule=log
отражает новые коммиты, которые вы сделали внутри самого подмодуля (в то время как родительский репозиторий знает только о новом SHA1, а не о контенте)
Обратите внимание, что с Git 2.11 (4 квартал 2016 года) вы сможете показать фактическую разницу, выполненную в подмодуле из родительского репо.
См. Коммит fd47ae6, коммит 8e6df65, коммит 602a283, коммит 99b43a6, коммит 61cfbc0, коммит 660e113, коммит 8576fde (31 августа 2016 г.) от Jacob Keller ( jacob-keller
)
Смотрите коммит cd48dad (31 августа 2016 г.) от Junio C Hamano ( gitster
)
(Объединено Юнио С Хамано - gitster
- в коммите 305d7f1, 12 сентября 2016 г.)
" git diff --submodule={short,log}
"механизм был улучшен, чтобы позволить" --submodule=diff
msgstr "показать патч между коммитами субмодуля, привязанными к суперпроекту.
Остерегайтесь этого последнего варианта, хотя: git diff --submodule=diff
в подмодуле, который имеет свои собственные подмодули, которые имеют изменения, выдают ошибку:
fatal: bad object.
Только Git 2.13 (Q2 2017) исправляет эту ошибку:
Смотрите коммит 17b254c (31 марта 2017 г.) Stefan Beller ( stefanbeller
)
(Объединено Юнио С Хамано - gitster
- в коммите 1776a71, 17 апреля 2017 г.)
Это происходит потому, что мы неправильно инициализируем среду, в которой запускается diff, в подмодуле.
Это означает, что мы наследуем среду от основного процесса, который устанавливает переменные среды. (Очевидно, мы устанавливаем переменные окружения, которые мы не устанавливаем, когда не в подмодулях, т.е..git
каталог связан)