-
Notifications
You must be signed in to change notification settings - Fork 3
远程分支修剪
由于我们有很多人在 Metasploit GitHub 存储库上创建和合并分支, 因此我们需要定期摆脱旧的和废弃的分支. 这是我的技术:
克隆一个新的 metasploit-framework.git 存储库:
todb@presto:~/github/todb-r7$ git clone github_r7:rapid7/metasploit-framework.git msf-backup.git
查看我们拥有的每个远程分支. 这样, 如果你搞砸了并删除了重要的内容, 则可以稍后再从此备份克隆中将其重新添加.
todb@presto:~/github/todb-r7$ cd msf-backup.git
todb@presto:~/github/todb-r7/metasploit-framework$ for b in `git branch -r | grep -v "HEAD -> origin" | sed 's/^ origin\///'`; do git checkout -b $b --track origin/$b; done
用 Tarball 解压
todb@presto:~/github/todb-r7$ cd ..
todb@presto:~/github$ tar zxvf msf-backup.git.tar.gz
todb@presto:~/github$ rm -rf msf-backup.git
现在, 再次克隆 metasploit. 我这样做是因为我喜欢在 "真实" 克隆上处理 20 个分支, 而且我不想遍历我的所有起源与非起源的东西.
mazikeen:./rapid7$ git clone github_r7:rapid7/metasploit-framework.git msf-prune
现在开始找出要删除的分支.
首先, 清除所有对修剪有反应的东西. 通常情况不是很多.
mazikeen:./msf-prune$ git prune remote origin
接下来, 看一下已合并的内容和未合并的内容. 我们可以立即删除大部分合并的东西.
mazikeen:./msf-prune$ git branch -r --merged
mazikeen:./msf-prune$ git branch -r --no-merged
这是单行代码 http://stackoverflow.com/questions/2514172/listing-each-branch-and-its-last-revisions-date-in-git#2514279 它按日期顺序列出所有远程合并分支.
mazikeen:./msf-prune$ for k in `git branch -r --merged |grep -v "HEAD ->" | sed s/^..//`; do echo -e `git log -1 --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k --`\\t"$k";done | sort
数完最后要保留的位数, 进行算术运算, 然后再加上另外两个管道, 以捕获超过两个星期的历史. 这些是没有人可能会错过的合并分支.
mazikeen:./msf-prune$ for k in `git branch -r --merged |grep -v "HEAD ->" | sed s/^..//`; do echo -e `git log -1 --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k --`\\t"$k";done | sort | head -45 | sed "s/^.*origin\///" > /tmp/merged_to_delete.txt
开始 Pull:
mazikeen:./msf-prune$ for b in `cat /tmp/merged_to_delete.txt`; do echo Deleting $b && git push origin :$b; done
请注意, 我们仍然有 tarball, 因此, 如果需要恢复所有这些分支, 则只需重新 pull 即可.
与上面几乎相同, 但是使用 --no-merged
而不是 --merged
并允许较旧的未合并分支 (例如 2 个月) .
有时, 某些人可能会遇到与这些丢失的分支同步的问题, 并且需要自己 git remote prune origin
. 或者, 他们希望再次查看这些分支 -- 尤其是未合并的分支. 因此, 让人们知道你只是在 metasploit-hackers 列表和 Freenode IRC 频道上做到了这一点. 如果有人想要一个旧的分支, 只需转到你的备份 fork, 然后像备份任何分支一样将其备份回去即可: git checkout branchname && git push origin branchname
, 没问题.