我正在尝试定期同步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
有更优雅的解决方案吗?
答案 0 :(得分:19)
使用git update-ref
请注意,在推送而不是拉动时,您可以非常轻松地将您想要的内容放到裸存储库中。
使用此:
git clone --mirror . /tmp/bareclone
创建您希望完全保持同步的裸存储库 现在,要将所有分支同步到裸克隆镜像,请使用
git push /tmp/bareclone --mirror
请注意,这也将删除源回购中但不在(仍然)在裸克隆中的任何磁头。另请注意,您可以使用send-pack而不是push,因为此接口相当低级并且实际上由send-pack实现
HTH
正如评论者所指出的那样,我轻率地避开了这样一个主题,即它似乎不可能立即做反过来。但是,你可以通过做一些稍微先进的事情来实现目标:
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
所以没有什么,但是它告诉你如何使用管道命令来实现它,所以我们现在可以根据我们的需求调整它们:
现在如果您确定知道自己在做什么,可以使用以下样式在本地复制分支:
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)
这也可以组合使用,因此您也可以拥有远程定义。 我建议,因为这意味着本地分支实际上正在跟踪遥控器中的分支,如果你不小心用这些强大的功能破坏了这些分支上的一些本地提交,你将拥有更好的绝缘/恢复选项。获取命令
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