Как сделать GIT локальным совпадением удаленным (как будто только что клонировано)? - PullRequest
0 голосов
/ 20 февраля 2019

Я удалил кучу веток BitBucket.Я хочу, чтобы мои местные отражали это без необходимости вручную удалять каждую ветку.Я должен быть в состоянии сделать что-то, чтобы «просто сделать мой локальный поиск совпадающим с моим пультом, как будто я только что сделал новый клон».я хочу просто удалить свой проект и повторно клонировать - это должна быть простая функциональность, встроенная в GIT.На самом деле это всего лишь 8 веток, поэтому я мог бы сделать это вручную без особых усилий, но я пытаюсь найти лучшие способы сделать это здесь.

edit2: Один из связанных ответов предлагает:

git remote prune origin сокращает отслеживание ветвей не на пульте.

Это похоже на то, что я хочу, но не удаляет локальные ветви.В нем говорится об удалении для многих источников / ветвей, но git branch по-прежнему отображает все мои старые ветви, которых нет в удаленном.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Я видел много хороших предложений, но похоже, что реальный ответ в том, что GIT не предоставляет более простой команды, чем удаление проекта и использование клона GIT.IMO должна быть команда git reset --hard для всех веток и всех остальных GIT-треков.

0 голосов
/ 20 февраля 2019

TL; DR: вы действительно хотите установить fetch.prune.Тем не менее, я собираюсь ответить на вопрос, который вы задали, а не на тот, который вы должны иметь: -)

Чтобы превратить ваш существующий клон в нечто, похожее на свежий клон, вам нужно как минимум четыре шага.

  1. Выполнить git fetch -p.Или настройте fetch.prune на true в локальном хранилище или в настройках для каждого пользователя и запустите git fetch.Это приведет к удалению любых origin/* имен удаленного отслеживания в вашем хранилище, соответствующих именам веток, которые раньше существовали в хранилище, но не существуют по адресу origin.

  2. Удалите вручную любыеветви, которые вам не нужны - все, кроме одной.Для этого вам нужно проверить тот, который вы хотите сохранить.Если хотите, автоматизируйте это удаление, но имейте в виду, что если у вас есть коммиты, которые вы никогда не отправляли в апстрим, вы можете потерять их в этот момент.См. Ниже.

  3. git reset --hard ваши оставшиеся ветви к их коллегам по дистанционному отслеживанию.В этот момент вы можете потерять некоторые коммиты.См. Ниже.

  4. Выполнить 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).Обычно вы хотите сделать это вручную под своим собственным контролем, а не только потому, что что-то изменилось вверх по течению.

...