Использование обновления подмодуля 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 в верхней части рабочего дерева, но должны обрабатывать относительные пути, заданные пользователем в командной строке.