Git与远程repository同步tag和branch

有时候,干的活也可能有点杂,什么代码仓库管理之类的事也会做一些。很久之前,我在内部建立了一个的各种Linux kernel、KVM、QEMU、Xen、libvirt等源码仓库的mirror,一般来说还是比较好用的 :-) 不过,最近发生过两点小事情,就是分别关于Git与远程repository的Tag和Branch没有同步的问题,简单记录一下吧。
 
问题1:Git如何同步远程repository的分支(branch)
某天,小C同学问我,为啥VV.git仓库里面本来已经删除了branchA这个分支,但是我的mirror中还是有这个分支呢?
分析:我本来是使用“git fetch”命令来下载或更新远程的代码仓库,一般来说,新增的branch/tag等都是可以正常下载并更新的。只是某个分支在远程repository中已经被删除了,直接"git fetch"是不能将远程已经不存在的Branch等在本地删除的。
解决方法:


 
问题2:Git如何同步远程repository的标签(tag)
某天,又是小C同学在问我,为啥VV.git仓库里面本来已经删除了tagA这个标签,但是我的mirror中还是有这个标签呢(其实他自己打标签时有出了点疏漏,他发现后,就删除了tagA重新打一个tagB,而不想别人在我的mirror中看到那个不正确的tagA标签)?
分析:我依然是使用"git fetch --prune"来做的,正常情况下该挺正常的才对,而且我还接着使用了"git fetch --tags"来保证下载所有的tag;不过,对于远程repository中已经删除了的tag,即使是"git fetch --tags"也不会让其在本地也将其删除的。而且,似乎git目前也没有提供一个直接的命令和参数选项可以删除本地的在远程已经不存在的tag(如果有知道的同学,麻烦告知一下,以便相互学习)。
解决方法:我是用了一个简单粗暴的方法 —— 先删除本地所有的Tag,然后重新fetch即可。(当然,也可以写个简单的脚本实现:先做本地tag和远程tag的比较,然后删除本地的在远程repo中已经不存在的tag,保留着远程存在的tag。)

 
附我的一个简单的小脚本:

 
参考阅读:
http://stackoverflow.com/questions/1841341/remove-local-tags-that-are-no-longer-on-the-remote-repository
http://stackoverflow.com/questions/6373277/git-sync-local-repo-with-remote-one
man git

master

Stay hungry, stay foolish.

2 Comments

  1. 关于git 有一个这样的疑问:
    git 仓库在本地有两种存在的形式,一种是直接本地分支。还有一种是pull下来以后,但是没有以分支的形式存在,而是以origin/远程分支名的形式,这个是不是就是你说的mirror?
    在执行git pull的时候,到底是更新当前指向的本地分支,还是会更新所有的mirror?有一些混乱,能否指教?谢谢

陈东进行回复 取消回复

邮箱地址不会被公开。 必填项已用*标注

*