gbu*_*rri 10 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
Run Code Online (Sandbox Code Playgroud)
我必须使用'cp'命令来更新本地分支:
git fetch --all
cp -r refs/remotes/origin/* refs/heads
Run Code Online (Sandbox Code Playgroud)
有更优雅的解决方案吗?
seh*_*ehe 19
而不是复制ref文件(坏的坏!)使用 git update-ref
请注意,在推送而不是拉动时,您可以非常轻松地将您想要的内容放到裸存储库中.
用这个:
git clone --mirror . /tmp/bareclone
Run Code Online (Sandbox Code Playgroud)
创建要保持完全同步的裸存储库现在,要将所有分支同步到裸克隆镜像,请使用
git push /tmp/bareclone --mirror
Run Code Online (Sandbox Code Playgroud)
请注意,这也将删除源回购中但不在(仍然)在裸克隆中的任何磁头.另请注意,您可以使用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)
Run Code Online (Sandbox Code Playgroud)
设置`url = git://your.server/project.git'例如
我确保裁剪是在一个中等安全的位置创建的.效果非常类似于做.
git remote add fetched $url --fetch
Run Code Online (Sandbox Code Playgroud)
所以没有什么,但它告诉你如何使用管道命令来实现它,所以我们现在可以根据我们的需求调整它们:
现在,如果您确定知道自己在做什么,可以使用以下样式在本地复制分支:
git init --bare .
git fetch $url -- $(git ls-remote -h $url |
while read sha ref; do echo "$ref:$ref"; done)
Run Code Online (Sandbox Code Playgroud)
注意:如果要强制更新(例如,当存在是因为上游底垫中,复位,过滤分支,或修改提交的没有快进拉(一般-任何改写历史)取代
echo "$ref:$ref"
的echo "+$ref:$ref"
;(感谢多夫)
这也可以组合使用,因此您也可以拥有远程定义.我建议,因为它意味着本地分支实际上正在跟踪遥控器中的分支,如果您不小心使用这些强大的获取命令破坏了这些分支上的一些本地提交,您将拥有更好的绝缘/恢复选项
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
Run Code Online (Sandbox Code Playgroud)
好玩,HTH
归档时间: |
|
查看次数: |
9136 次 |
最近记录: |