Git - Автоматическая перемотка вперед всех отслеживающих ветвей - PullRequest
32 голосов
/ 02 января 2011

Я установил ветви отслеживания с параметром --track, и когда я делаю git pull на master, он выбирает все ветви на origin/branchname, но не сливается с локальными ветками отслеживания.Это очень раздражает, потому что, если я позже сделаю git push на master, это говорит о том, что обновления без ускоренной пересылки были отклонены в ветвях отслеживания, так как они не были переадресованы при начальной git pull.

Мой вопрос: Как мне сделать так, чтобы git pull извлекал все ветви и автоматически перематывал все ветви отслеживания?

Примечание: git pull раньше использовал быструю пересылку всех моих веток отслеживания с помощью моих репозиториев GitHub, но теперь, когда я настроил свои собственные репо с помощью Gitolite, эта проблема возникает.

Ответы [ 5 ]

14 голосов
/ 27 июня 2014

Сценарий оболочки, который ускоряет пересылку всех ветвей, для которых в восходящей ветви установлен соответствующий источник / ветвь без каких-либо проверок

  • это не меняет вашу текущую ветку в любое время, нет необходимости иметь дело с изменениями рабочей копии и потерей времени на проверку

  • он выполняет только ускоренную перемотку вперед, ветви, которые не могут быть переадресованы, будут отображать сообщение об ошибке и будут пропущены

Убедитесь, что восходящие ветви всех ваших веток настроены правильно, запустив git branch -vv. Установите восходящую ветку с помощью git branch -u origin/yourbanchname

Скопируйте и вставьте в файл chmod 755:

#!/bin/sh

curbranch=$(git rev-parse --abbrev-ref HEAD)

for branch in $(git for-each-ref refs/heads --format="%(refname:short)"); do
        upbranch=$(git config --get branch.$branch.merge | sed 's:refs/heads/::');
        if [ "$branch" = "$upbranch" ]; then
                if [ "$branch" = "$curbranch" ]; then
                        echo Fast forwarding current branch $curbranch
                        git merge --ff-only origin/$upbranch
                else
                        echo Fast forwarding $branch with origin/$upbranch
                        git fetch . origin/$upbranch:$branch
                fi
        fi
done;
5 голосов
/ 16 сентября 2013

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

[alias]
    pull-all = !"for b in $(git for-each-ref refs/heads --format='%(refname)') ; do git checkout ${b#refs/heads/} ; git pull --ff-only ; done"

Затем вы можете запустить git pull-all, он будет перебирать ваши локальные ветви и запускать git pull --ff-only для каждого.

5 голосов
/ 02 января 2011

Но подождите:

Примечание: я полагаю, вы отслеживали все ваши удаленные ветви, как в " Отслеживайте все удаленные ветви git как локальные ветви. "


Примечание: Git 2.0 (Q2 2014) представит commit b814da8 config push.ff:

pull.ff::

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

  • При значении false эта переменная указывает Git создать дополнительный коммит слияния в таком случае (эквивалентно предоставлению опции --no-ff из командной строки).
  • При значении only допускаются только такие ускоренные слияния (эквивалентно предоставлению опции --ff-only из командной строки).
2 голосов
/ 15 апреля 2019

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

git branch \
  --format "%(if)%(upstream:short)%(then)git push . %(upstream:short):%(refname:short)%(end)" |
  sh

Как это работает?

Используется пользовательский формат с командой git branch. Для каждой ветви с восходящей веткой она печатает строку со следующим шаблоном:

git push . <remote-ref>:<branch>

Это может быть передано непосредственно в sh (при условии, что имена ветвей правильно сформированы). Пропустите | sh, чтобы увидеть, что он делает.

Протест

В настоящее время извлеченная ветвь не будет обновлена ​​с сообщением как

! [remote rejected] origin/master -> master (branch is currently checked out)

Для этого вы можете прибегнуть к обычному git pull --ff-only.

Псевдоним

Добавьте следующее к вашему .gitconfig, чтобы git fft выполнил эту команду:

[alias]
        fft = !sh -c 'git branch --format \"%(if)%(upstream:short)%(then)git push . %(upstream:short):%(refname:short)%(end)\" | sh' -

Псевдоним - это сокращение от «ускоренного отслеживания (ветки)».

0 голосов
/ 02 января 2011

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

...