Может ли мой 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 изначально не поддерживает эту концепцию.

Другие вопросы по тегам