我认为git fetch --prune origin <refspec>
会执行以下操作
a)修剪陈旧的远程跟踪分支
b)然后像git fetch origin <refpec>
一样进行抓取
但阅读doc
git fetch --prune origin refs/tags/*:refs/tags/*
的行为不像上面那样。
因此,修剪行为取决于refspec。
对于传递的refspec,使用fetch进行修剪将如何表现? 我正在使用git 2.18
编辑:添加我看到的更多观察结果:
我的remote.origin.fetch
= remote.origin.fetch=refs/heads/*:refs/remotes/origin/*
Why am I mentioning it ? Because of this strange relation
案例1: git fetch --prune --dry-run origin
这会修剪远程存储库中不存在的远程跟踪分支。然后像git fetch --dry-run origin
案例2: git fetch --prune --dry-run origin refs/heads/*:refs/remotes/origin/*
这首先删除所有我的远程跟踪分支(请注意,jk
需要修剪并且不能重新创建),然后再次创建它们,然后对其进行更新。奇怪!这是示例:
- [deleted] (none) -> origin/holo
- [deleted] (none) -> origin/ioio
- [deleted] (none) -> origin/jj
- [deleted] (none) -> origin/jkkk
- [deleted] (none) -> origin/jk
* [new branch] holo -> holo
* [new branch] ioio -> ioio
* [new branch] jj -> jj
* [new branch] jk -> jkkk
= [up to date] holo -> origin/holo
= [up to date] ioio -> origin/ioio
= [up to date] jj -> origin/jj
= [up to date] jkkk -> origin/jkkk
案例3: git fetch --prune --dry-run origin master
或git fetch --prune --dry-run origin master:master
不修剪任何东西(Master也存在于远程仓库中,但是在我的本地中有远程跟踪分支需要修剪,但它没有涉及)。之后,其行为类似于git fetch --dry-run origin master
* branch master -> FETCH_HEAD
= [up to date] master -> origin/master
案例4: git fetch --prune --dry-run origin refs/tags/*:refs/tags/*
这只是先修剪标签,然后再像git fetch --dry-run origin refs/tags/*:refs/tags/*
案例5: git fetch origin --prune --verbose --dry-run master:refs/remotes/origin/kk
(假设远程存储库中不再存在kk
分支)
首先删除refs/remotes/origin/kk
,然后重新创建并更新。
- [deleted] (none) -> origin/kk
= [up to date] master -> origin/kk
= [up to date] master -> origin/master
因此,案例1和案例4是我认为应该像我在开始提问时所解释的那样。情况2,情况3和情况5没有遵循该模式。那我该怎么总结呢?对于refspec传递,如何使用fetch进行修剪?在所有我们可以解释行为的方式中,有没有什么共同的模式?