我正在努力维护我的远程存储库的精确副本(备份)。我每天运行一个cron作业,试图从远程更新。我想按原样更新存储库,包括所有分支、标记等。我在git中读到了使用--mirror
选项的文章,但它没有下载源代码。此外,我还需要添加或删除添加到远程的任何分支或标记。
考虑到我的遥控器名为“原产地”,我目前执行以下操作:
// clone
git clone --mirror https://my_site.com/path/to/repo.git repo/.git
// track all remotes
for remote in `git branch -r | grep -v /HEAD`; do git checkout --track $remote ; done
git fetch --all
git pull --all
此方法工作正常,但每次运行时都尝试签出远程,而不是在找到新的远程分支时进行检出。此外,如果本地分支已从远程删除,则不删除该分支。我想标签也一样。
So...is有更好的方法来维护远程的深度本地副本/备份,动态地处理每次添加和删除吗?
发布于 2020-04-09 05:05:54
镜像克隆是一个裸露的克隆,其中所有的引用名都在每个git fetch
上复制。因此,要更新镜像克隆,只需在镜像(通常为原点):git fetch
:git fetch origin
的远程上运行镜像,或者只运行git fetch
,当镜像完成后,镜像就会被更新。
我读过关于在git中使用--镜像选项的文章,但是它没有下载源代码.
这句话对我来说毫无意义。Git没有“来源”:Git已经提交了。每个提交都有每个文件的完整和完整的快照。如果有提交,那么就有文件:不是源单数,而是每个文件(在每个提交中)。
我最好的猜测是你的意思是:镜像克隆人没有工作树。这是事实:这就是--bare
的意思。没有工作树的原因是,如果要更新来自其他Git存储库的所有引用--包括所有分支名称--最好永远不要在这个存储库中做任何工作,因为每次从其他存储库更新这个存储库时,这个工作都会被销毁。
要使用镜像克隆,例如,要构建某物,您应该从它克隆到一个常规的(非镜像,非裸的)克隆。然后,您可以向这个常规克隆中添加一个额外的遥控器。如果您希望在这个常规克隆中进行新提交,然后将这些新提交发送到您创建镜像克隆的存储库,您将需要这个额外的远程,以便命名此另一个存储库所在的URL。
因此,一个比较完整的例子可能是:
cd place-where-mirrors-live
git clone --mirror $URL mirror.git
其次是:
cd place-to-work
git clone /path/to/place-where-mirrors-live/mirror.git working
cd working
git remote add upstream $URL
git checkout -b some-new-branch
... do work ...
git commit
git push upstream -u HEAD
其次是:
(cd /path/to/where-mirrors-live/mirror.git && git fetch --prune)
要更新mirror.git
中的镜像,请根据在working
中进行的更新,然后使用git push
发送到$URL
的Git存储库。
如果在$URL
上删除Git中的分支,则使用:
git push upstream --delete some-branch
git fetch --prune
步骤将删除镜像中的分支。您可能希望将fetch.prune
配置为镜像中的true
,或者在个人(--global
) Git配置中配置,这样每个git fetch
都是一个git fetch --prune
。
如果您对此非常老套的话,您可能希望使用git remote update --prune
来更新镜像,但这不应该做git fetch --prune
不会做的事情。(在遥远的过去,这个领域中存在一些Git bug:并非所有的修剪都适用于所有情况。)
https://stackoverflow.com/questions/61114160
复制相似问题