而不是复制周围的参考文件(糟糕糟糕!)使用git update-ref
请注意,当推送而不是拉取时,您可以很容易地将您想要的内容存储到裸存储库中。
用这个:
git clone --mirror . /tmp/bareclone
创建您想要完全同步的裸存储库
现在,要将所有分支同步到裸克隆镜像,请使用
git push /tmp/bareclone --mirror
请注意,这还将删除不在源存储库中但(仍然)在裸克隆中的任何头。另请注意,您可以使用 send-pack 而不是在那里推送,因为该接口相当低级,并且实际上是由 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' 例如
我确保裁判是在一个相对安全的位置创建的。效果和doing非常相似。
git remote add fetched $url --fetch
所以没有什么太多的,but它向您展示了如何使用管道命令来实现它,因此我们现在可以根据我们的需求调整它们:
2.直接fetch到本地分支(头)
Now 如果你确定你知道自己在做什么您可以使用以下样式在本地复制分支:
git init --bare .
git fetch $url -- $(git ls-remote -h $url |
while read sha ref; do echo "$ref:$ref"; done)
Note: if you want to force update (e.g. when there is no fast-forward pull because of an upstream rebase, reset, filter-branch, or amended commit (in general -- any rewritten history) replace echo "$ref:$ref"
by echo "+$ref:$ref"
; (Thanks Dov https://stackoverflow.com/users/449215/dov-grobgeld)
3. 完整的蒙蒂
这也可以组合起来,这样您也可以有一个远程定义。我建议这样做,因为这意味着本地分支实际上正在跟踪来自远程的分支,如果您使用这些强大的获取命令不小心破坏了这些分支上的一些本地提交,您将拥有更好的隔离/恢复选项
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