Как настроить git push для автоматической настройки upstream без -u?
Я хочу git push origin
чтобы автоматически установить восходящую ссылку, когда я впервые нажимаю на локально созданную ветку.
Я знаю о git push -u
, но я не хочу думать о том, использовал ли я -u
до или иным образом установите восходящую ссылку. Другими словами, я хочу git push
автоматически иметь эффект git push -u
на любой толчок ветви, которая еще не имеет восходящего потока.
Это возможно? Если для этого требуется псевдоним или служебный скрипт, это нормально.
14 ответов
Вы можете настроить его с git config
с помощью git config --global push.default current
,
Документы: https://git-scm.com/docs/git-config
Примечание: тот факт, что новая политика push по умолчанию " simple
" полагается на ветвь, имеющую восходящий поток, означает, что:
установка восходящей ветки рассматривается как добровольный шаг, а не скрытый автоматический
Когда "
git push [$there]
"не говорит, что нажать, мы использовали традиционную семантику" соответствия "до сих пор (все ваши ветви были отправлены на удаленный компьютер, если там уже есть ветви с одинаковыми именами).Мы будем использовать
simple
"семантика, которая выдвигает текущую ветвь к ветке с тем же именем, только когда текущая ветвь настроена на интеграцию с этой удаленной ветвью.
Существует переменная конфигурации пользовательских настроек "push.default
"чтобы изменить это.
Итак, основываясь на ответе mechanicalfish, вы можете определить псевдоним с правильными двойными кавычками ("
) сбежал (\"
):
git config alias.pu "![[ $(git config \"branch.$(git rev-parse --abbrev-ref HEAD).merge\") = '' ]] && git push -u || git push"
git pu origin
Sc0ttyD предлагает в комментариях следующий псевдоним:
alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'
В несколько строк:
alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] &&
git push -u origin $(git symbolic-ref --short HEAD) ||
git push'
Поскольку я не думаю, что это возможно с помощью git config, вот что вы можете сделать в bash:
[[ $(git config "branch.$(git rev-parse --abbrev-ref HEAD).merge") = '' ]] && git push -u || git push
Если текущая ветвь имеет удаленную ветвь отслеживания, она вызывает git push
в противном случае это вызывает git push -u
У меня была такая же проблема. Я нашел этот псевдоним (.gitconfig)
[alias]
track = "!git branch --set-upstream-to=origin/`git symbolic-ref --short HEAD`"
Использование: git track
один раз за новую ветку (в настоящее время проверено). Тогда просто нажимай как обычно:)
Ответы @VonC и @Frexuz полезны, но оба их решения выдают ошибку для меня. Используя оба их ответа, я собрал что-то, что работает для меня:
[alias]
pu = ![[ $(git config "branch.$(git symbolic-ref --short HEAD).merge") = '' ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push
Это приводит к выполнению либо git push -u origin $BRANCHNAME
или же git push
в зависимости от того, является ли его вверх по течению (свойство branch.$BRANCHNAME.merge
) определено.
Для ввода этого псевдонима в командной строке потребуются escape-коды, поэтому, вероятно, проще всего использовать редактор для вставки в правильный файл ($HOME/.gitconfig
(Глобальный), .git/config
(местный) или /etc/gitconfig
(система))
Краткий ответ
Если вы хотите быть явным и использовать -u
вариант, но просто не хочу печатать:
git push -u origin my-long-and-c0mpl1c4t3d-branch-name`
Тогда вы можете использовать следующий псевдоним:
[alias]
push-u = !git push -u origin $(git symbolic-ref --short HEAD)
И просто наберите:
git push-u
Длинный ответ
Как правило, необходимость -u
(сокращение для --set-upstream
) - это когда мы только что создали новую локальную ветку и хотим отправить ее вверх по течению. Удаленный репозиторий еще не имеет этой ветви, поэтому нам нужно следующее:
git checkout -b foo # Create local branch
git commit -m "Foo" # Create local commit
git push -u origin foo # Create and track remote branch, and push commit
git commit -m "Bar" # Create local commit
git push # Push commit
Лично мне нравится необходимость явного git push -u
при создании удаленной ветви: это довольно значительная операция, которая позволяет поделиться с вами совершенно новой веткой.
Тем не менее, я ненавижу, что мы должны явно написать git push -u origin foo
, Это не только боль печатать, но, что более важно, это довольно подвержен ошибкам! При вводе имени ветви легко ошибиться, и новая удаленная ветвь не будет иметь того же имени, что и ваша локальная ветвь! В большинстве случаев, на самом деле, вы хотите, чтобы исходный репозиторий был origin
и ветка upstream должна иметь то же имя, что и ваша локальная ветка.
Поэтому я использую следующий псевдоним в моем .gitconfig
, который является подмножеством превосходного ответа, предоставленного Марком:
[alias]
push-upstream = !git push --set-upstream origin $(git symbolic-ref --short HEAD)
Теперь мы можем сделать следующее, которое все еще явно, но менее подвержено ошибкам:
git checkout -b foo # Create local branch
git commit -m "Foo" # Create local commit
git push-upstream # Create and track remote branch, and push commit
git commit -m "Bar" # Create local commit
git push # Push commit
Я решил эту проблему с помощью этого простого скрипта Bash. Он не будет работать с существующими ветками, но если вы создадите все свои ветви с помощью этой функции, вы всегда будете автоматически устанавливать свою ветку восходящего потока.
function con { git checkout -b $1 && git push --set-upstream origin $1; }
$1 представляет первый аргумент, который вы передаете после con
так что это как делать:
git checkout -b my-new-branch && git push -u my-new-branch
... просто делая это:
con my-new-branch
Единственный полностью честный ответ - «нет».
Я прочитал все ответы в этом и другие вопросы, которые задают то же самое.
Каждый опубликованный ответ по- прежнему требует от вас передачи специальных параметров при первом нажатии на новую ветку.
Если вы хотите использовать встроенные функции git только с менее возможными ключами, просто введите:
$ git push -u o
tab H
tab
и автозаполнение даст вам$ git push -u origin HEAD
Чтобы включить автокомпиляцию в OSX, настройте ~/.git-completition.bash
файл с этим содержимым и добавьте следующие строки в свой~/.bash_profile
файл и перезапустите терминал:
# git branch autocomplete
if [ -f ~/.git-completion.bash ]; then
. ~/.git-completion.bash
fi
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
Это также влияет на встроенные терминалы, такие как vscode и т. Д.
Сегодня мне попалась (новая?) опция "push.autoSetupRemote". git config help говорит:
If set to "true" assume --set-upstream on default push when no upstream tracking exists for the current branch; this option takes effect with push.default options simple,
upstream, and current. It is useful if by default you want new branches to be pushed to the default remote (like the behavior of push.default=current) and you also want
the upstream tracking to be set. Workflows most likely to benefit from this option are simple central workflows where all branches are expected to have the same name on
the remote.
Я сделал расширение git с полезными скриптами, включая этот:
usage: git line push
Push the current branch and set an upstream if needed.
Если по какой-либо причине ни один из других ответов у вас не работает, вы можете заменить
git push
с помощью этой функции bash для автоматической повторной отправки push-запроса с правильными флагами, когда это необходимо.
gitpush()
{
git push -v 2>&1 | # perform push command, pipe all output
tee /dev/tty | # keep output on screen and pipe it forward
(
cmd=$(sed -n "s/^.*\(git push --set-upstream origin .*\)$/\1/p");
[[ -n "${cmd// }" ]] && (echo "> $cmd"; eval $cmd);
) # if we get output that matches the command to perform, execute it
}
Вы пожертвуете частью прогресса вывода push, но в остальном все работает так, как ожидалось.
Лично я буду использовать ответ JT Jobe.
git fetch origin
git push origin
^ это устанавливает верхнее течение для меня