Я думал, git fetch --prune origin <refspec>
делает следующее
a) обрезает устаревшие удаленные ветви отслеживания
b) затем выполняет выборку как git fetch origin <refpec>
do
, но читает doc ,
git fetch --prune origin refs/tags/*:refs/tags/*
ведет себя не так, как описано выше.Итак, поведение обрезки зависит от refspec.
Как будет вести себя сокращение с fetch по отношению к переданному refspec?Я использую git 2.18
РЕДАКТИРОВАТЬ: добавив больше наблюдений, которые я видел:
My remote.origin.fetch
= remote.origin.fetch=refs/heads/*:refs/remotes/origin/*
Почему я упоминаю это?Из-за этого странного отношения
Случай 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
Ничего не удаляет (мастер существовал и в удаленном репо, но были ветви удаленного отслеживанияв моем местном, который нуждался в сокращении, но это не касалось этого).После этого ведет себя как 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 не следовали схеме.Итак, что я должен сделать вывод тогда?Как поведет себя обрезка с fetch по отношению к переданному refspec?Есть ли какая-то общая картина среди всего, чем мы можем объяснить поведение?