2010-10-05 158 views
12

我设置了一个Github后接收挂钩,它在我的Github存储库进行推送时在我的Web服务器上运行脚本。将所有远程分支提取到裸Git存储库中

当脚本运行时,我希望它保留与我的Github存储库同步的本地裸仓库。要做到这一点,我有它运行此命令:

git fetch origin && git reset --soft refs/remotes/origin/master

然后,如果从我的工作站我推掌握在Github上,一切都运行得很好。但是,如果我推送到另一个远程分支,这些更改不会反映在我的服务器的本地裸存储库中。

我假设有一些方法让脚本获取所有的远程分支,但我不知道如何做到这一点。我知道较新版本的git有一个用于提取/拉取的all选项,但我使用的git版本是1.6.3.3,似乎没有这个选项。

有谁知道如何让我的脚本获取所有远程分支?

谢谢!

+0

“升级到最新的git”似乎是一个相当直接的解决方案,当然? – Ether 2010-10-05 17:44:07

+0

我想我可以做到这一点。我只是想避免搞乱Ubuntu的软件包。 – Tom 2010-10-05 17:57:53

回答

2

也许使用shell脚本?

#!/bin/sh 

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

注意:你的问题小术语错误:的git fetch|pull--all选项获取所有的“遥控器”,而不是“远程分支机构”。

+0

感谢您关于--all的信息。没有意识到这一点。 +1 :) – Tom 2010-10-07 17:09:18

+0

Git 1.6.3有'git remote update',这是一个内置版本。 'git fetch --all'在拥有它的版本中是首选,因为* git remote *命令应该是用于维护遥控器的配置,而不是对它们执行操作('update'在这方面是一个异常,因此'git fetch --all'的偏好)。 – 2010-10-10 07:16:27

0

想象一下我会在自己的解决方案中提供我自己的解决方案。虽然我接受了Ramkumar,但这是它的灵感。所不同的是,我不想所有的遥控器来获取,而是“出身”每个远程分支...

 

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

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

+1

你真的不应该试图解析* git分支*的输出。较低级别的“plumbing”命令* git for-each-ref *设计用于参考名称的脚本迭代。我很惊讶,一个普通的'git fetch origin'不会更新所有“origin/*”远程跟踪分支。迭代使用'git fetch origin branch-name'可能无法做到你想要的。当你给* git fetch *一个没有冒号的refspec(最后一个arg是refspec)时,它只会将提取的提交存储在特殊的FETCH_HEAD ref中(它不会更新你的远程跟踪分支)。 – 2010-10-10 07:10:59

+0

我明白你的观点。我不知道git for-each-ref命令。谢谢! – Tom 2010-10-11 23:33:22

19

git fetch origin '*:*'为我工作。

+0

这个!你不需要循环。 – Piedone 2015-12-07 16:25:40

+0

如果你只想分支,使用'refs/heads/*:refs/heads/*'。如果你只想分支和标签(排除像github pulls这样的东西),还可以添加'refs/tags/*:refs/tags/*'。 – Patrick 2016-07-28 22:05:43

相关问题