将所有远程分支获取到裸的Git仓库中

19
我设置了Github的post-receive hook,在每次向我的Github仓库提交推送时,它会在我的Web服务器上运行一个脚本。
当该脚本运行时,我希望它能够让本地bare仓库与我的Github仓库同步。为此,我让它运行以下命令:
git fetch origin && git reset --soft refs/remotes/origin/master 如果我从我的工作站推送到Github上的master分支,一切都运行得很好。但是,如果我推送到另一个远程分支,这些更改就无法在服务器的本地bare仓库中反映出来。
我假设有一种方法可以使脚本获取所有远程分支,但我不知道如何实现。我知道新版本的git有一个--all选项用于fetch/pull,但我使用的是git版本1.6.3.3,似乎没有这个选项。
有谁知道如何使我的脚本获取所有远程分支吗?
谢谢!

升级到最新的git似乎是一个相当直接的解决方案,不是吗? - Ether
我想我可以这样做。我只是试图避免干扰Ubuntu的程序包。 - Tom
4个回答

40

git fetch origin '*:*' 对我来说可行。


这个!你不需要循环。 - Piedone
4
如果您只需要分支,请使用 refs/heads/*:refs/heads/*。如果您需要分支和标签(排除像Github pulls这样的东西),也请添加 refs/tags/*:refs/tags/* - phemmer

1

也许可以使用一个 shell 脚本吗?

#!/bin/sh

for i in `git remote show`; do
    git fetch $i;
done;

注意:您的问题中有一个小术语错误:git fetch|pull--all 选项会获取所有“远程仓库”,而不是“远程分支”。


1
Git 1.6.3 已经有了 git remote update,这是一个内置版本。在拥有此功能的版本中,推荐使用 git fetch --all,因为 git remote 命令应该用于维护远程配置,而不是对它们执行操作(update 在这方面是一个例外,因此更倾向于使用 git fetch --all)。 - Chris Johnsen
git fetch origin ':' 看起来是最好的。 - Patrik Laszlo

0

趁这个机会,我想提供自己的解决方案。虽然灵感来自Ramkumar的回答,但我还是采纳了他的方法。不同之处在于我不想从所有远程仓库中获取,而是从"origin"中的每个远程分支中获取...


#!/bin/bash
REMOTE_BRANCHES=$(git branch -r | awk -F'/' '{print $2}')
for i in $REMOTE_BRANCHES; do
    git fetch origin $i
done

免责声明:我还没有真正实现这个方法,但它应该很接近了。


2
你真的不应该尝试解析git branch的输出。更低级别的“管道”命令git for-each-ref是为脚本化迭代ref名称而设计的。我很惊讶一个简单的git fetch origin没有更新所有你的“origin/”远程跟踪分支。反复使用git fetch origin branch-name也可能不会达到你想要的效果。当你给git fetch*一个没有冒号的refspec(最后一个参数是refspec)时,它只会将获取的提交存储在特殊的FETCH_HEAD ref中(它不会更新你的远程跟踪分支)。 - Chris Johnsen
我明白你的意思。我不知道 git for-each-ref 命令。谢谢! - Tom

0

git fetch origin *:* 在 Windows 上适用于我。

git 版本为 2.29.2.windows.3


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接