TL;DR: вам действительно нужна настройка fetch.prune
. Тем не менее, я отвечу на вопрос, который вы задали, а не на тот, который вы должны были задать. :-)
Чтобы превратить ваш существующий клон в то, что выглядит как свежий клон, вам нужно как минимум четыре шага.
Выполнить git fetch -p
. Или настройте fetch.prune
на true
в локальном репозитории или в настройках для каждого пользователя и запустите git fetch
. Это удалит все origin/*
имена для удаленного отслеживания в вашем репозитории, соответствующие именам ветвей, которые раньше существовали, но больше не существуют в репозитории по адресу origin
.
Вручную удалите все ветки, которые вам не нужны — все, кроме одной. Для этого вам нужно проверить тот, который вы хотите сохранить. Автоматизируйте это удаление, если хотите, но имейте в виду, что если у вас есть коммиты, которые вы никогда не отправляли вверх по течению, вы можете потерять эти коммиты на этом этапе. Увидеть ниже.
git reset --hard
ваши оставшиеся ветки своим удаленным аналогам. На этом этапе вы можете потерять некоторые коммиты. Увидеть ниже.
Выполнить git clean -dfx
. Увидеть ниже.
Теперь у вас есть то, что напоминает свежий клон, за исключением следующих элементов:
В журнале ссылок для вашего HEAD
по-прежнему хранятся все ваши недавние действия, в которых могут сохраняться некоторые коммиты. Вы также можете очистить это, используя git reflog expire --expire=all --expire-unreachable=all
.
Любые тайники, которые у вас есть, все еще существуют. Вы можете удалить их все с помощью git stash clear
.
Любые необычные ссылки, которые вы сделали, все еще существуют (например, refs/notes/
, refs/replace/
из git replace
). Вы должны удалить их вручную, если хотите.
Любой статус поверхностного клонирования сохраняется. Вы можете использовать git fetch --unshallow
, чтобы очистить это.
Некоторые биты «предполагать неизмененные» или «пропустить рабочее дерево» все еще могут быть установлены в индексе. Вы можете использовать git update-index --no-assume-unchanged
и git update-index --no-skip-worktree
, чтобы исправить это. Вам нужно сделать это только в том случае, если вы установили эти биты ранее; Git никогда не устанавливает их самостоятельно.
(Я думаю, что это все, но я могу пропустить один или два пункта.)
Примечания
Если бы вам нужно было сделать новое git clone
, вы бы:
- создайте новый пустой репозиторий:
mkdir name; cd name; git init
- добавьте к нему удаленное имя
origin
, используя соответствующий URL-адрес: git remote add origin url
- запустите
git fetch
, чтобы получить все существующие ветки в качестве имен удаленного отслеживания origin/*
- выберите одну из этих ветвей (на основе вашего аргумента
-b
для git clone
) для создания локально
- запустите
git checkout name
, который создаст имя из origin/name
.
Этот новый репозиторий имеет те же имена для удаленного отслеживания, которые остались после шага 1 (удаление выборки), поэтому шаг 1 исправляет ваши имена для удаленного отслеживания. У него нет имен ветвей — нет ссылок refs/heads/*
— кроме тех, которые были созданы на последнем шаге, поэтому на шаге 2 они удаляются. Вы, конечно, находитесь в этой оставшейся ветке, поэтому шаг 2 включает git checkout name
, а шаг 3, git reset --hard
, заставляет имя вашей ветки указывать на правильный коммит при обновлении всего вашего индекса и большей части вашего рабочего дерева.
Конечно, неотслеживаемые файлы и каталоги могут остаться, поэтому на шаге 4, git clean -dfx
, Git удалит их, включая файлы, игнорируемые директивами .gitignore
.
Чтобы автоматизировать удаление веток, которые не являются текущей веткой, вам понадобится небольшой скрипт. В связанных вопросах есть некоторые (возможные дубликаты). Но они удаляют ваши ветки, которые не являются ничьими ветками. Вы не должны просто удалять их случайным образом: вы должны уже удалить их самостоятельно, когда закончите с ними, чтобы нечего было удалять. Вот почему шаги 2 и 3 перечислены, но их не следует выполнять — по крайней мере, не автоматически.
Последняя операция, git clean -dfx
, удаляет артефакты сборки (например, скомпилированные файлы *.o
или файлы Python с байтовым кодом *.pyc
). Обычно вы хотите сделать это вручную под своим контролем, а не только потому, что что-то изменилось выше по течению.
person
torek
schedule
20.02.2019
foo
, потому чтоorigin/foo
больше нет: например, у вас могут быть коммиты, которые нужно скопировать (выбрать вишенки) в какую-то другую ветку. - person torek   schedule 20.02.2019