10

我正在尝试定期同步一个 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

有没有更优雅的解决方案?

4

1 回答 1

19

而不是复制参考文件(坏坏!)使用git update-ref

请注意,在推送而不是拉取时,您可以很容易地将您想要的内容放到裸存储库中。

用这个:

 git clone --mirror . /tmp/bareclone

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

 git push /tmp/bareclone --mirror

请注意,这还将删除不在源代码库中但(仍然)在裸克隆中的任何头。另请注意,您可以使用 send-pack 而不是 push 那里,因为这个接口是相当低级的,实际上是由 send-pack 实现的

高温高压


正如评论者所指出的,我略微回避了似乎不可能立即进行反向的主题。但是,您可以通过做一些稍微高级的事情来实现目标,例如:

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.直接取到本地分支(heads)

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

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

注意:如果您想强制更新(例如,由于上游变基,重置,过滤分支或修改提交(通常 - 任何重写的历史记录)而没有快进拉动时,请替换echo "$ref:$ref"echo "+$ref:$ref";(感谢Dov

3. 满月

这也可以结合起来,所以你也可以有一个远程定义。我建议这样做,因为这意味着本地分支实际上正在跟踪来自远程的分支,如果您不小心使用这些强大的 fetch 命令破坏了这些分支上的一些本地提交,您将拥有更好的隔离/恢复选项

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

于 2011-04-05T23:02:46.173 回答