我的git存储库可以获得备用存储库的信息吗?

时间:2013-11-19 20:17:23

标签: git repository mirroring

如何让我的远程存储库拥有多个镜像存储库的信息?

我创建了一个本地存储库并添加了origin和server1

# git remote add origin https://github.com/user/repo.git
# git remote add server1 git@git.ttu.edu:bharath/repo.git

现在,我将存储库推送到源并在另一台计算机上克隆它。克隆的存储库不知道server1。有没有办法可以在克隆的存储库中提供server1信息?我该怎么做?

1 个答案:

答案 0 :(得分:3)

不幸的是,没有。 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本身不支持这个概念。