Может ли мой git-репозиторий содержать информацию об альтернативных репозиториях?
Как у моего удаленного репозитория есть информация о нескольких зеркальных репозиториях?
Я создал локальный репозиторий и добавил источник и сервер1
# git remote add origin https://github.com/user/repo.git
# git remote add server1 git@git.ttu.edu:bharath/repo.git
Теперь я помещаю репозиторий в исходное состояние и клонирую его на другую машину. Клонированный репозиторий не имеет представления о server1
, Есть ли способ, которым я могу сделать server1
информация доступна в клонированном хранилище? Как мне это сделать?
1 ответ
К сожалению нет. Git не передает конфигурацию по проводам, потому что это может привести к проблемам безопасности.
Я думаю, что лучший способ достичь этого - создать сценарий, который добавляет дополнительную конфигурацию, которую вы хотите, и вы должны помнить, чтобы выполнить ее. Документируйте необходимость его запуска как часть процесса настройки, чтобы его было легче запомнить.
Сожалею!
ОБНОВИТЬ:
К сожалению, Git также не будет передавать скрипты хуков. Опять же, это мера безопасности. Возможно, вы клонируете кодовую базу, которой вы не доверяете, и для Git было бы неправильно выполнить произвольный код.
Я понимаю, что это не то, что вы хотите услышать, но это текущее состояние мира. Что-то, что вы могли бы сделать, и я хорошо это сделал, - это создать псевдоним, который поможет вам в этом процессе:
[alias]
setup = !sh -c 'git remote add origin https://github.com/user/$1.git; git remote add server1 git@git.ttu.edu:bharath/$1.git' -
Затем git setup REPO_NAME
настроил бы оба пульта для вас.
Если вы заинтересованы в выполнении сценария для вас, вы можете настроить post-checkout
хук, который проверяет наличие сценария в известном месте в хранилище и выполняет его, если сценарий еще не был выполнен. post-checkout
может вызываться довольно часто, поэтому вы можете не захотеть, чтобы он выполнялся полностью все время. Затем вы можете настроить собственный шаблон для post-checkout
в /usr/share/git-core/templates/hooks
,
Например, вы можете настроить /usr/share/git-core/templates/hooks/post-checkout
быть:
#!/bin/sh
test -f "$GIT_DIR/.ran-setup" && exit 0
# Call the setup script in the repo.
git show master:setup.sh > "$GIT_DIR/.setup-script" || {
# No setup.sh exists at the top of the repo, so there's nothing to execute.
exit 0
}
chmod +x "$GIT_DIR/.setup-script"
"$GIT_DIR/.setup-script" || {
echo 1>&2 "error: setup script failed to execute correctly."
# Clean up.
rm -f "$GIT_DIR/.setup-script"
# Note: this doesn't prevent anything from happening in Git. Git doesn't
# care about the exit value of the post-checkout script.
exit 1
}
# Clean up.
rm -f "$GIT_DIR/.setup-script"
touch "$GIT_DIR/.ran-setup"
Это проверит на setup.sh
на верхнем уровне главной ветки и попытайтесь выполнить его в первый раз. Тогда в вашем setup.sh
Сценарий, вы могли бы сделать:
#!/bin/sh
# Attempt to get the repository name from the origin.
repo_name=$(git config remote.origin.url |
sed -e 's|.*/\([^/]*\)$|\1|' |
sed -e 's|\.git$||')
# Add the remote as long as there's a repo name.
if [ "$repo_name" != '' ]; then
git remote add server1 "git@git.ttu.edu:bharath/${repo_name}.git"
fi
Вы можете поместить шаблоны в другое место, если у вас нет возможности изменять общесистемные или вы не хотите (потому что система используется совместно с другими пользователями, которые, например, могут не захотеть эту функцию), Вы можете использовать --template
возможность git clone
указать альтернативное местоположение или установить следующее в ~/.gitconfig
:
[init]
templatedir=/path/to/new/template/dir
Недостатком любого такого подхода является то, что человек может заставить вас выполнить произвольный код. Таким образом, "друг" может убедить вас клонировать репозиторий, который в конечном итоге сотрет ваш жесткий диск, или что-то еще хуже. И именно поэтому Git изначально не поддерживает эту концепцию.