Как отменить 'git fetch'

Я просто добавил remote A к своему repo B и затем запустил git fetch A. Как я могу отменить выборку? Если бы я просто удалил remote A: git remote remove A1 отменил бы выборку?

UPDATE:

$ git remote add A path/to/A
$ git fetch A

Выше приведены команды, которые я выполняю, поэтому в результате я получил все ветки, извлеченные из моего repo B, однако мне просто нужна одна конкретная ветка из repo A, и она мне нужна, чтобы перейти в определенную папку на repo B, но это другая story Слияние кода между двумя различными git-репозиториями.

Ответ 1

Вы можете отменить все выборки из удаленного A просто удалив этот пульт:

git remote remove A

Теперь просто добавьте его снова и выберите только одну ветку:

git remote add A <path/to/repository>
git fetch A <name of branch>

Ответ 2

Трудно 1 "отменить" а git fetch, но никогда не бывает 2 какая - либо причина нужно отменить git fetch.

Помните, что git fetch - это вызов удаленного устройства, получение списка названий веток для SHA-1, перенос коммитов и других объектов, необходимых для хранения их в вашем репозитории, а затем обновление ветвей удаленного отслеживания так что они указывают на удаленный ток (с момента, когда вы только что его вызвали) подсказки ветки. Это не влияет ни на один из ваших файлов рабочих деревьев, и если вы завтра запустите git fetch, любая работа, проделанная сегодня, может быть пропущена завтра. Если вам удастся отменить fetch, завтрашний запуск должен будет выполнить работу, выполненную сегодня, так что это чистая потеря: вы просто потратили некоторое усилие, так что вашему git придется больше вводить код в сеть завтра,

Тем не менее, время для сносок. :-)


1 Это не так сложно, если у вас есть удаленные блокировки (что вы, вероятно, и делаете): просто используйте удаленные блоки для поиска ветвей удаленного отслеживания, обновленных в последней выборке, эта же информация также может быть доступна в файле FETCH_HEAD а затем используйте git update-ref чтобы указать эти ссылки на предыдущие записи в журнале. Но это все равно оставит выбранные объекты в вашем репозитории, поэтому для их полного устранения вы должны также удалить промежуточные записи reflog, а затем запустить git gc --prune=now, что требует большой заботы и отбросит все не привязанные к объектам, а не только те, которые были вызваны самой последней fetch.

2 Я думаю, можно утверждать, что причиной этого может быть "работа на низком диске", особенно если крупный объект случайно нажат на пульт дистанционного управления и будет удален с пульта путем следующей fetch. Тем не менее, работа в файловой системе, которая находится вне пространства, сложна в общем, и я не уверен, что хочу делать многое здесь, кроме как перемещать весь репозиторий в другое место (где-то без проблем с дисковым пространством).

Ответ 3

Мне очень понравился ответ от torek, но он не предоставляет вам команды для "обновления журналов", что я и искал. Я нашел это в другом ответе отменить git fetch, поэтому я просто оставляю его здесь, чтобы упростить поиск других.


Предположим, что у вас есть пульт origin, а локальная ветвь develop основана на master, но ваш локальный master отстает от origin/master (, но вы его пока не видите потому что вы еще не загрузили origin).

Таким образом, выполнение git fetch добавит новые коммиты из origin/master и теги в ваш локальный репозиторий. В некоторых случаях вы вообще не хотите видеть эти новые коммиты, и они уменьшат читабельность вашей истории.

Сказав это, вы можете "отменить" git fetch, выполнив:

git update-ref refs/remotes/origin/master refs/remotes/origin/[email protected]{1}

Все, что это делает - это изменяет указатель origin/master на предыдущее состояние. Возможно, вам придется немного поиграть с {n}, чтобы получить точное состояние, но в целом это может помочь.

Ответ 4

Вы можете удалить любые ветки, которые вы случайно выбрали, которые вы не хотите сохранять, с помощью следующей команды:

git update-ref -d refs/remotes/YOUR_REMOTE_NAME/BRANCH_NAME_TO_DELETE

Чтобы предотвратить их git remote set-branches YOUR_REMOTE_NAME desired_branch1 [desired_branch2, desired_branch3, etc], настройте ваш git remote на выборку только указанных веток: git remote set-branches YOUR_REMOTE_NAME desired_branch1 [desired_branch2, desired_branch3, etc], Например, git remote set-branches YOUR_REMOTE_NAME desired_branch1 [desired_branch2, desired_branch3, etc] git remote set-branches origin master.

Поведение set-веток по умолчанию всегда состоит в замене списка. Если вы хотите добавить, используйте --add: git remote set-branches --add origin another_branch