git裸存储库中的“fetch --all”不会将本地分支与远程分支同步

时间:2011-04-05 22:27:06

标签: git git-fetch git-bare

我正在尝试定期同步git裸存储库,我的本地分支使用“--track”选项创建。这是我的配置(没有不必要的东西):

[core]
        bare = true
[remote "origin"]
        url = git@github.com:Ummon/D-LAN.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master
[branch "website"]
        remote = origin
        merge = refs/heads/website

我必须使用'cp'命令来更新本地分支:

 git fetch --all
 cp -r refs/remotes/origin/* refs/heads

有更优雅的解决方案吗?

1 个答案:

答案 0 :(得分:19)

使用git update-ref

而不是复制ref文件(坏的!)

请注意,在推送而不是拉动时,您可以非常轻松地将您想要的内容放到裸存储库中。

使用此:

 git clone --mirror . /tmp/bareclone

创建您希望完全保持同步的裸存储库 现在,要将所有分支同步到裸克隆镜像,请使用

 git push /tmp/bareclone --mirror

请注意,这也将删除源回购中但不在(仍然)在裸克隆中的任何磁头。另请注意,您可以使用send-pack而不是push,因为此接口相当低级并且实际上由send-pack实现

HTH


正如评论者所指出的那样,我轻率地避开了这样一个主题,即它似乎不可能立即做反过来。但是,你可以通过做一些稍微先进的事情来实现目标:

1。简单,安全,非常令人兴奋。

git fetch $url -- $(git ls-remote -h $url |
    while read sha ref; do echo "$ref:refs/remotes/fetched/${ref#refs/heads/}"; done)

设置`url = git://your.server/project.git',例如

我确保裁剪是在中等安全的位置创建的。效果非常类似于做。

git remote add fetched $url --fetch

所以没有什么,但是它告诉你如何使用管道命令来实现它,所以我们现在可以根据我们的需求调整它们:

2。直接获取到本地分支(头)

现在如果您确定知道自己在做什么,可以使用以下样式在本地复制分支:

git init --bare .
git fetch $url -- $(git ls-remote -h $url |
    while read sha ref; do echo "$ref:$ref"; done)
  

注意:如果您想强制更新(例如,由于上游rebase,重置,filter-branch,没有快进拉动,或修改后的提交(一般来说 - 任何重写的历史记录)将echo "$ref:$ref"替换为echo "+$ref:$ref" ;(谢谢Dov

3。完整的monty

这也可以组合使用,因此您也可以拥有远程定义。 我建议,因为这意味着本地分支实际上正在跟踪遥控器中的分支,如果你不小心用这些强大的功能破坏了这些分支上的一些本地提交,你将拥有更好的绝缘/恢复选项。获取命令

git init --bare .
git remote add fetched $url --fetch
git for-each-ref --format='%(refname:short)' -- 'refs/remotes/fetched/' |
    while read ref; do git branch -t "$(basename "$ref")" "$ref"; done

玩得开心,HTH