Подтвердить что ты не робот

Git - автоматическая перемотка вперед всех ветвей отслеживания при нажатии

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

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

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

4b9b3361

Ответ 1

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

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


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

pull.ff::

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

  • Если установлено значение false, эта переменная сообщает git создать дополнительное слияние в таком случае (что эквивалентно предоставлению опции --no-ff из командной строки).
  • Если установлено значение only, допускаются только такие быстрые слияния (эквивалентно предоставлению опции --ff-only из командной строки).

Ответ 2

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

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

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

Убедитесь, что все ветки ваших ветвей установлены правильно, запустив 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;

Ответ 3

Если вы действительно хотите ускорить пересылку всех локальных ветвей, отслеживающих удаленные ветки, вы можете захотеть добавить это как псевдоним к вашему ~/.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 для каждого из них.

Ответ 4

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

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

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

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

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

Это может быть передано непосредственно в sh (при условии, что имена ветвей правильно сформированы). Опустить | 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' -

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

Ответ 5

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