而不是复制参考文件(坏坏!)使用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