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

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

ОБНОВИТЬ:

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

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


person sreginogemoh    schedule 24.02.2016    source источник
comment
Почему вы хотите отменить получение?   -  person mipadi    schedule 24.02.2016
comment
также, если вы сомневаетесь, вы можете попробовать. удаление пульта ничего не сломает.   -  person njzk2    schedule 24.02.2016
comment
@mipadi Просто хочу очистить все, что было доставлено в мой репозиторий   -  person sreginogemoh    schedule 24.02.2016
comment
насколько я понимаю, выборка приносит файлы в мое хранилище .git, так зачем мне они там сидят, если я не хочу объединяться   -  person sreginogemoh    schedule 24.02.2016
comment
@sreginogemoh, чтобы держать вас в курсе обновлений локального репозитория. Git — это DVCS. Это зависит от того, что у всех есть последняя копия репо. Таким образом, резервные копии не нужны, поскольку каждый, кто клонировал репозиторий, имеет резервную копию.   -  person TheGeorgeous    schedule 24.02.2016
comment
@TheGeorgeous Но в моем случае это настраиваемый удаленный доступ, из которого я не объединяю все ветки. Однако fetch принес все ветки из repo A, но мне для этого нужна только одна ветка. Так что принесу только что привезенные вещи, которые мне совсем не нужны и никогда не понадобятся.   -  person sreginogemoh    schedule 24.02.2016
comment
Если вы просто хотите удалить определенные удаленные ветки, используйте git branch -r -d. Вы по-прежнему будете хранить объекты в течение обычного срока хранения (по умолчанию 14 дней). Однако вы, вероятно, захотите настроить свою конфигурацию, чтобы в будущем выборка с одного и того же удаленного устройства забирала только определенные нужные ветки.   -  person torek    schedule 25.02.2016
comment
этот вопрос очень важен, когда вы случайно получаете все ветки функций от всех разработчиков вашей компании за последние 5 лет. Мне нужны только ветки, которые мне нужны в моем локальном репо   -  person bodovix    schedule 07.01.2021
comment
@bodovix Мне любопытно, как можно использовать объединенные ветки функций. (Я могу придумать некоторые, но они довольно надуманные.)   -  person TTT    schedule 03.06.2021
comment
@TTT предположим, что это зависит от того, где / где вы работаете, но аудиты будут одним из них, наши ветки функций сопоставляются с историями, поэтому их очистка через X месяцев лишит нас этого уровня отслеживаемости. ИДК, мне нравится хранить ветки, которые я сделал, локально, но меня раздражало, когда я случайно получал сотни других. С тех пор я обнаружил чудеса Grep, так что теперь их очень легко отфильтровать, и это меня не так сильно беспокоит: git branch -a | grep мой фильтр   -  person bodovix    schedule 08.06.2021
comment
@bodovix Думаю, есть много способов снять шкуру с этой кошки. В нашем случае, между фиксациями слияния с сообщениями фиксации, которые ссылаются на номер истории или даже из истории, хранящейся в инструменте PR, мы всегда могли воссоздать любую ветку функции, которую мы хотели, без необходимости сохранять какую-либо из них. Но если вы не используете коммиты слияния или инструмент PR с историей, вам понадобится другой способ, и сохранение веток в репо, безусловно, один из способов.   -  person TTT    schedule 08.06.2021
comment
@TTT, вот почему я предположил, что мы храним наши целую вечность, но кто знает. Это может быть просто потому, что так всегда делалось. Я мог бы узнать больше;) - но, несмотря на это, greps в значительной степени аннулировал эту проблему для меня.   -  person bodovix    schedule 08.06.2021


Ответы (5)


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

git remote remove A

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

git remote add A <path/to/repository>
git fetch A <name of branch>
person qzb    schedule 24.02.2016
comment
проверьте, это может помочь stackoverflow.com/questions/10099258/ - person maytham-ɯɐɥʇʎɐɯ; 04.03.2018

Трудно1 "отменить" git fetch, но никогда2 нет причин необходимости отменять git fetch.

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

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


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

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

person torek    schedule 24.02.2016
comment
Другой участник мог зафиксировать изменения, вызывающие проблемы. Ошибочные коммиты можно временно удалить, сбросив HEAD, но указатель журнала на мастер больше не появится. Это может усложнить перебазирование ветвей функций, и по этой причине в прошлом мне хотелось отменить выборку. - person Felix Lechner; 04.07.2019
comment
@FelixLechner: эти коммиты будут доступны исключительно по именам удаленного отслеживания, таким как origin/master или имена тегов. Они станут доступными только по вашим собственным именам веток, если вы предпримете какие-либо действия, например, запустив git merge или git rebase, чтобы изменить свои собственные имена веток. git fetch никогда не затрагивает ваши собственные ветки. Если вы хотите выполнить перебазирование или слияние, вы можете сделать это, указав хэш-идентификатор фиксации вместо имени ветки. - person torek; 04.07.2019
comment
У меня есть очень веская причина отменить git fetch. Я получил несколько месяцев коммитов из репозитория Chromium и хотел бы вернуть свои 100 ГБ дискового пространства. Я получил с помощью git fetch --depth=100000, чтобы получить только последние несколько месяцев, теперь я хотел бы удалить все это и получить только последние 100 коммитов или около того. - person Jespertheend; 17.06.2021
comment
@Jespertheend: вы можете сделать git fetch --depth=100, чтобы еще немного отшлифовать вещи, но я не уверен, что git gc уберет здесь беспорядок. Но отмечу, что 100 ГБ — это около 5 долларов США. (Я знаю, это не так просто. Мне нужно обновить свою собственную систему, и я чувствую ту же боль :-)) - person torek; 17.06.2021
comment
@torek В итоге я просто удалил весь репозиторий и снова его извлек. К счастью, настройка конвейера сборки не была слишком сложной. Однако покупка дополнительного жесткого диска не является проблемой. У меня есть несколько жестких дисков, которые я мог бы использовать. Но подключение внешних устройств к ноутбуку не является идеальным решением, а MacBook не так просто обновить. - person Jespertheend; 17.06.2021
comment
Еще одна причина, по которой нужно отменить выборку, - это если вы столкнулись с ошибкой Git в реальной ситуации во время git fetch и хотите ее воспроизвести;) - person philb; 29.06.2021
comment
@philb: если вы находитесь на этом уровне (отладка Git), вы должны знать, как работают refs и refspecs :-) - person torek; 30.06.2021

Мне очень понравился ответ torek, но он не дает вам команд для «обновления reflogs», что я и искал. Я нашел это в другом ответе reverse a 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/master@{1}

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

person The Godfather    schedule 27.03.2018
comment
ну, в моем случае update-ref — это половина истории. Я хочу буквально привести локальный репозиторий в состояние, в котором он был до fetch, чтобы убедиться, что следующий «git fetch» ​​пойдет и загрузит файл (ы) из удаленного репозитория. , проблема, с которой я столкнулся, - это странная ошибка «ошибка: раздувание: ошибка потока данных (неизвестный метод сжатия) хочу доказать или опровергнуть, является ли это просто повреждением репозитория, или на самом деле есть новый метод сжатия, с которым мой локальный git не может справиться. - person Igor Stasenko; 22.04.2020

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

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

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

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

person Olimon F.    schedule 10.12.2018

Очень простое решение:

git reset --keep HEAD@{1}

Или второе решение:

git reset --hard master@{"10 minutes ago"}
person yash sanghavi    schedule 02.04.2021