Использование обновления подмодуля git -init на почтовом крючке
У меня есть этот простой hook on/hooks/post-update внутри открытого репозитория:
#!/bin/sh
git-update-server-info
GIT_WORK_TREE=/home/user/apps/application-site/dev git checkout -f develop
GIT_WORK_TREE=/home/user/apps/application-site/dev git submodule update --init
GIT_WORK_TREE=/home/user/apps/application-site/master git checkout -f master
GIT_WORK_TREE=/home/user/apps/application-site/master git submodule update --init
В репозитории есть некоторые подмодули, которые, как я ожидаю, нажимают на производственный сервер и проверяют два ветки на двух каталогах, поэтому я могу позже создать dev.myapp.com для ветки разработки и www.myapp.com для главная ветвь, и все это обновление также подмодулей на ветвях.
Checkout работает как ожидалось, но не обновление подмодуля --init,: '(
Удаленный выход вызывает ошибки.
remote: Switched to branch 'develop'
remote: You need to run this command from the toplevel of the working tree.
remote: Switched to branch 'master'
remote: You need to run this command from the toplevel of the working tree.
Я не совсем уверен, что делать.
Ответы
Ответ 1
Ответ должен сделать именно то, что вам говорит git, а именно:
remote: You need to run this command from the toplevel of the working tree.
Так и сделай. Здесь образец post-update
hook:
#!/bin/sh
export GIT_DIR=$(pwd)
cd /home/lars/projects/stackoverflow/gitstuff/worktree
git checkout -f master
git submodule init
git submodule update
Это предполагает, что:
-
core.bare
false
-
receive.denyCurrentBranch
- ignore
. Вам это нужно, потому что в противном случае вы получите ошибку, нажав в репозиторий с core.bare
, установленным на false
.
... и, похоже, работает в моем ограниченном тестировании.
Ответ 2
Ваша первая переменная GIT_WORK_TREE
(строка 4) является подозрительной, учитывая, что вы ссылаетесь на следующие строки на переменную $WORK_TREE
(которая не определена в этом script).
Обратите внимание, что при запуске git1.8.4 (июль 2013 г.) у вас не было бы (для git submodule
команд) возврата к корневой каталог больше.
См. commit 091a6eb0feed820a43663ca63dc2bc0bb247bbae:
subodule: отказаться от требования верхнего уровня
Используйте новую опцию rev-parse --prefix
для обработки всех путей, переданных команде подмодуля, отбрасывая требование о том, чтобы она выполнялась с верхнего уровня репозитория.
Поскольку интерпретация URL-адреса относительного субмодуля зависит от того, настроена ли настройка "remote.origin.url
", явно блокируйте относительные URL-адреса в "git submodule add
", если не на верхнем уровне рабочего дерева.
Подписано: John Keeping
Зависит от commit 12b9d32790b40bf3ea49134095619700191abf1f
Это делает "git rev-parse
" вести себя так, как если бы он был вызван из указанного подкаталога репозитория, с той разницей, что любые пути к файлам, которые он печатает, имеет префикс с полным путем от вершины рабочего дерева.
Это полезно для сценариев оболочки, где мы можем захотеть cd
в верхней части рабочего дерева, но должны обрабатывать относительные пути, заданные пользователем в командной строке.