TL; DR: вы действительно хотите установить fetch.prune
.Тем не менее, я собираюсь ответить на вопрос, который вы задали, а не на тот, который вы должны иметь: -)
Чтобы превратить ваш существующий клон в нечто, похожее на свежий клон, вам нужно как минимум четыре шага.
Выполнить git fetch -p
.Или настройте fetch.prune
на true
в локальном хранилище или в настройках для каждого пользователя и запустите git fetch
.Это приведет к удалению любых origin/*
имен удаленного отслеживания в вашем хранилище, соответствующих именам веток, которые раньше существовали в хранилище, но не существуют по адресу origin
.
Удалите вручную любыеветви, которые вам не нужны - все, кроме одной.Для этого вам нужно проверить тот, который вы хотите сохранить.Если хотите, автоматизируйте это удаление, но имейте в виду, что если у вас есть коммиты, которые вы никогда не отправляли в апстрим, вы можете потерять их в этот момент.См. Ниже.
git reset --hard
ваши оставшиеся ветви к их коллегам по дистанционному отслеживанию.В этот момент вы можете потерять некоторые коммиты.См. Ниже.
Выполнить git clean -dfx
.См. Ниже.
Теперь у вас есть то, что напоминает свежий клон, за исключением следующих предметов:
Reflog для вашего 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 <em>name</em>; cd <em>name</em>; git init
- добавили к нему удаленный сервер с именем
origin
, используя соответствующий URL: git remote add origin <em>url</em>
- запустите
git fetch
, чтобы получить все существующие ветви в качестве origin/*
имен для удаленного отслеживания - , чтобы выбрать одну из этих ветвей (в зависимости от аргумента
-b
для git clone
) для локального создания - запустите
git checkout <em>name</em>
, что создает имя из origin/<em>name</em>
.
Этот новый репозиторий имеет те же имена для удаленного отслеживаниякоторые остаются после шага 1 (выборка сокращения), поэтому на шаге 1 фиксируются ваши имена для удаленного отслеживания.У него нет имен ветвей - нет ссылок refs/heads/*
- кроме тех, которые были созданы на последнем шаге, поэтому шаг 2 удаляет их.Вы, конечно, находитесь в этой оставшейся ветви, поэтому шаг 2 включает git checkout <em>name</em>
, а шаг 3, git reset --hard
, заставляет имя вашей ветви указывать на правильный коммит при обновлении всего вашего индекса и большей части вашего рабочего дерева.
Конечно, неотслеживаемые файлы и каталоги могут остаться, поэтому на шаге 4, git clean -dfx
, Git удаляет их, включая файлы, игнорируемые директивами .gitignore
.
Для автоматизации удаления ветвей, которые не являютсятекущая ветка, вам понадобится небольшой скрипт.Есть несколько связанных вопросов (возможные дубликаты).Но они удаляют ваши ветви, которые не чьи-либо ветви.Вы не должны просто случайным образом удалять их: вы должны уже удалить их самостоятельно , когда вы закончите с ними , так что нечего удалять.Вот почему шаги 2 и 3 перечислены, но не должны выполняться - по крайней мере, не автоматически.
Последняя операция, git clean -dfx
, удаляет артефакты сборки (например, скомпилированные*.o
файлов или *.pyc
байт-кодированных файлов Python).Обычно вы хотите сделать это вручную под своим собственным контролем, а не только потому, что что-то изменилось вверх по течению.