Настройте git, чтобы тянуть и нажимать все ветки - программирование

Настройте git, чтобы тянуть и нажимать все ветки

Я хотел бы нажать и потянуть все ветки по умолчанию, включая вновь созданные.

Есть ли параметр, который я могу определить для него?

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

Я создал новую ветку с тем же именем и попытался потянуть, но она не работает. Просит меня обо всех удаленных конфигурациях ветки. Как установить его.

4b9b3361

Ответ 1

Самый простой способ:

git push --all origin

Это приведет к тегам и ветвям.

Ответ 2

С помощью современных git вы всегда извлекаете все ветки (поскольку удаленное отслеживание переходит в пространство имен refs/remotes/origin/*, видимое с помощью git branch -r или git remote show origin).

По умолчанию (см. документацию по переменной push.default config) вы нажимаете соответствующие ветки, что означает, что сначала вы должны сделать git push origin branch для git, чтобы постоянно ее нажимать на git push.

Если вы хотите всегда нажимать все ветки, вы можете настроить push refspec. Предполагая, что пульт называется origin, вы можете использовать git config:

$ git config --add remote.origin.push '+refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push '+refs/tags/*:refs/tags/*'

или непосредственно отредактируйте файл .git/config, чтобы иметь что-то вроде следующего:

[remote "origin"]
        url = [email protected]:/srv/git/repo.git
        fetch = +refs/heads/*:refs/remotes/origin/*
        fetch = +refs/tags/*:refs/tags/*
        push  = +refs/heads/*:refs/heads/*
        push  = +refs/tags/*:refs/tags/*

Ответ 3

Включение + в спецификации push, вероятно, является плохой идеей, так как это означает, что git с радостью сделает непереходное нажатие даже без -f, и если удаленный сервер настроен на их принятие, вы можете потерять историю.

Попробуйте следующее:

$ git config --add remote.origin.push 'refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push 'refs/tags/*:refs/tags/*'
$ git config --add remote.origin.fetch 'refs/heads/*:refs/remotes/origin/*'
$ git config --add remote.origin.fetch 'refs/tags/*:refs/tags/*'

Ответ 4

Я использовал ниже команды для переноса всех ветвей в новый репозиторий.

~$ git clone --mirror <url_of_old_repo>
~$ cd <name_of_old_repo>
~$ git remote add new-origin <url_of_new_repo>
~$ git push new-origin master
~$ git push new-origin --mirror

ПРИМЕЧАНИЕ: мне пришлось использовать вторую последнюю команду (то есть нажать master master) при клонировании репо из Atlassian Stash в AWS CodeCommit (пустое репо). Я не уверен в причине, но после нажатия (git push new-origin --mirror) ветка по умолчанию имела отношение к какой-либо другой ветки, чем master.

Ответ 5

Если вы перемещаете ветки на новое репо из старого и не имеете всех старых ветвей репо локально, вам сначала нужно отследить их.

for remote in `git branch -r | grep -v '\->'`; do git branch --track $remote; done

Затем добавьте новое дистанционное репо:

git remote add bb <path-to-new-repo>

Затем вы можете нажать все, используя эту команду:

git push -u bb --all

Или вы можете настроить репо с помощью команд конфигурации git, указанных в других ответах здесь, если вы не выполняете это одно время или не хотите перемещать локальные ветки.

Важный момент, другие ответы только толкают все ЛОКАЛЬНЫЕ ветки. Если ветки существуют только в альтернативном репозитории REMOTE, они не будут перемещаться, не отслеживая их в первую очередь. Представленный здесь цикл for поможет в этом.

Ответ 6

Чтобы просмотреть все ветки без использования git branch -a, вы должны выполнить:

for remote in `git branch -r`; do git branch --track $remote; done
git fetch --all
git pull --all

Теперь вы можете увидеть все ветки:

git branch

Чтобы проталкивать все ветки, попробуйте:

git push --all

Ответ 7

Если вы перемещаете все ветки в новое репо из старого, то в своем локальном репо вам нужно настроить отслеживание каждой ветки на существующие ветки происхождения, прежде чем нажимать на новое репо, иначе all ваши ветки происхождения не появятся в новом источнике. Делайте это вручную, отслеживая или проверяя каждую ветку или используя один лайнер:

for remote in `git branch -r | grep -v '\->' | grep -v master`; do git branch --track `echo $remote|sed 's=origin/=='` `echo $remote`; done

Эта однострочная команда основана на версиях этого в других ответах на этой странице, но, возможно, лучше, потому что:

  • он правильно настраивает отслеживание ветвей, в отличие от некоторых более старых вариантов этой команды на этой странице, которые только поставляют один параметр для -track, и, следовательно, каждая ветвь заканчивается мастером отслеживания - нехорошо
  • обозначает локальные ветки без префикса "origin/", которые я лично не хочу, и согласуется с тем, что происходит, когда вы обычно проверяете ветвь.
  • пропускает отслеживающий мастер, поскольку это уже происходит.
  • фактически ничего не проверяет, так быстро
  • избегает спотыкания над → в выводе git branch -r

Затем, если вы переключаете исход, замените ссылку на старое начало и укажите на новый пульт. Убедитесь, что вы сначала создаете новый пульт, используя графический интерфейс bitbucket/github, но не добавляйте в него никаких файлов или проблема слиянием. Например.

git remote set-url origin [email protected]:YOUR/SOMEREPO.git

Теперь нажмите. Обратите внимание, что вторая команда необходима, чтобы нажать теги:

git push -u --all origin
git push --tags origin

Ответ 8

for b in $(git branch -a | grep -v master | \
sed -e "s|remotes\/origin\/\(.*\)|\1|g"); do git checkout $b && \
git push origin $b; done

Ответ 9

Решение без жесткого кодирования origin в config

Используйте следующее в глобальной gitconfig

[remote]
    push = +refs/heads/*
    push = +refs/tags/*

Это подталкивает все ветки и все теги

Почему вы не должны жестко кодировать origin в config?

Если вы жестко указываете:

  • В итоге вы получите origin как удаленный доступ во всех репозиториях. Таким образом, вы не сможете добавить источник, но вам нужно использовать set-url.
  • Если инструмент создает пульт с другим именем, вся конфигурация не будет применяться. Тогда вам придется переименовать удаленный, но переименование не будет работать, потому что origin уже существует (из точки 1) помнить:)

Захват позаботится уже о современном git

Как ответ Якуба Нарбского:

С помощью современных git вы всегда извлекаете все ветки (как ветки удаленного отслеживания в пространство имен refs/remotes/origin/*