2017-02-15 1 views
0

Я работаю в неглубокий клон хранилища git. Поскольку мелкий клон содержит только одну ветвь удаленного отслеживания в файле .git/config, чтобы получить новые удаленные ветви, мне нужно их явно добавить. НапримерУдаление ветви в мелком клоне

git clone --depth 1 <remote-url> 
git remote set-branches --add origin <branch-name> 
git fetch --depth 1 origin <branch-name> 
git checkout <branch-name> 

Позже, если удалить ветвь

git checkout master 
git branch --delete <branch-name> 

и нажмите удаление на удаленный

git push --delete origin <branch-name> 

У меня есть проблема. Когда я pull или fetch я получаю сообщение об ошибке

фатальное: Не удалось найти исе < филиального-имя удаленного >

Там нет --remove варианта, соответствующего git remote set-branches --add так, как я могу удалить недостающее филиал? Это вопрос редактирования файла .git/конфигурации, чтобы удалить строку

fetch = +refs/heads/<branch-name>:refs/remotes/origin/<branch-name> 

или есть менее скрытый способ сделать это? Я удивлен, что нажатие на удаление ветки не обрезало строку выборки.

+0

Я не могу воспроизвести точную ситуацию, поэтому не уверен ... но делает ли git branch --unset-upstream 'work? –

+0

К сожалению, нет сообщений о том, что «фатальный: Branch» «не имеет информации о восходящем направлении». Я попробую его до удаления, хотя и посмотрю, поможет ли это – dumbledad

+0

Да, я, наконец, воспроизвел первоначальную ошибку (нашел тот шаг, который я пропустил), и вижу, что это не так легко. Я немного поиграю и дам вам знать, что я нахожу. –

ответ

1

Вариант 1: Избегайте проблем?

Проблема может быть устранена, если вы явно не укажете, какие ветки вы хотите извлечь. (Но если вам нужно получить только выбранный набор отраслей, вероятно, лучше перейти к варианту 2.) При создании клона вы можете сказать, что вы хотите, чтобы все ветви

git clone --depth=1 --no-single-branch ... 

Или, если вы уже клонированы и хотите получить остальные ветви: из ваших инструкций, вместо

git remote set-branches --add origin <branch-name> 

который конфигурирует выборки искать для конкретной отрасли, можно

git config --unset remote.origin.fetch 
git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* 
git fetch --depth=1 

Удаление ветви (локально и дистанционное ly) больше не вызывает проблемы.

(Вы можете быть в состоянии использовать более селективный шаблон, но в тех случаях, когда вы не хотите «все» можно поспорить, выбирать отдельные ветви.)

Если у вас уже есть хранилище и добавил несколько ветвей, как вы описали выше, команды конфигурации, аналогичные тому, что я перечислил, должны «восстановить». (Просто замените --unset с --unset-all в первой команде.)

Вариант 2: Фикс проблемы

Но если вам нужен ваш конфиг, чтобы показать отдельные ветви, можно обрабатывать удалить в одном из этих способов :

Вы можете использовать git config, чтобы непосредственно удалить настройки без ручного редактирования файлов.

git config --unset remote.origin.fetch <branch-name> 

берегись, <branch-name> интерпретируется как регулярное выражение, и, если он соответствует несколько значений, то он не будет работать. Так что, если вы получите предупреждение о нескольких значениях согласующих, вы должны были бы сделать что-то вроде

git config --unset remote.origin.fetch origin.<branch-name>$ 

Или вы можете использовать git remote set-branches:

Хотя нет явного git remote set-branches --remove или что-нибудь, что сортировать, вы можете использовать set-branchesбез флаг --add, чтобы полностью восстановить список удаленных филиалов. Если у вас слишком много других филиалов, это сработает. Например, учитывая только то, что было показано выше вы могли бы сделать

git remote set-branches origin master 

Но если вы добавили кучу других ветвей, вы должны перечислить их тоже или потерять их.

git remote set-branches origin master branch1 branch2 branch3 ... 

Вы можете автоматизировать процесс получения списка филиалов

git branch | sed s/'\* '// | xargs git remote set-branches origin 

Но что бы вопрос, если какой-либо из местных отделений нет, на самом деле, предназначены для отслеживания происхождения.

+0

Мне это не нравится, поскольку вам нужно будет создать список ветвей. Это выглядит намного сложнее, чем редактирование файла .git/config – dumbledad

+0

Зависит от того, что вы имеете в виду «легко». Если вы хотите обойти фарфор и вручную редактировать файлы, может быть меньше шагов. С другой стороны, фарфор защищает вас от развращения вашего репо (обычно). Поэтому, если вам это не нравится, не используйте его; как я сказал, я ищу что-то получше. Но также обратите внимание, что построение списка ветвей не является тем, что * hard * - возможно, утомительно. Независимо от того, вы спросили о менее скрытых способах этого. Пока что это одно. –

+0

Мне также пришло в голову, что мы можем написать однострочный bash, который получает результаты 'git branch' и объединяет их в' git remote set-branches'. Не уверен, что это обман, но может хорошо работать – dumbledad