Я хочу git push origin
автоматически устанавливать ссылку на восходящий поток, когда я впервые нажимаю локально созданную ветку.
Я знаю об этом git push -u
, но я не хочу думать о том, использовал ли я -u
раньше или иным образом устанавливал ссылку на восходящий поток. Другими словами, я хочу, git push
чтобы автоматически выполнялся эффект при git push -u
любом нажатии ветки, которая еще не имеет восходящего потока.
Это возможно? Если для этого требуется псевдоним или служебный сценарий, ничего страшного.
push.default
иbranch.<name>.merge
в git-config (1) ?push.default
установилcurrent
- вот как я могу просто сказатьgit push origin
без ссылки или апстрима. Но это не помогает с автоматической настройкой восходящего потока.Ответы:
Вы можете настроить его с
git config
помощьюgit config --global push.default current
.Документы: https://git-scm.com/docs/git-config/#Documentation/git-config.txt-pushdefault
источник
git push origin
без refspec или апстрима. Но это не помогает с автоматической настройкой восходящего потока.push
, например, только один разработчик в своей ветке, который редактирует только одну копию репо.Поскольку я не думаю, что это возможно с помощью git config, вот что вы можете сделать в bash:
Если текущая ветвь имеет ветку удаленного отслеживания, она вызывает,
git push
иначе вызываетgit push -u
источник
git config --global push.default current
.push.default=current
только создает ветку в удаленном репозитории с тем же именем, что и локальная ветка, но не устанавливает локальную ветку для отслеживания удаленной. Я не уверен, почему это так, но об этом стоит помнить.Примечание: тот факт, что новая политика push по умолчанию "
simple
" полагается на ветку, имеющую восходящую, означает, что:установка восходящей ветки рассматривается как добровольный шаг, а не скрытый автоматизированный
Так построения из mechanicalfish «s ответа , вы можете определить псевдоним, с правом двойных кавычек (
"
) экранированы (\"
):Sc0ttyD предлагает в комментариях следующий псевдоним:
В нескольких строках:
источник
-u
опция и почему нет конфигурации для автоматической настройки указанной опции (отсюда и псевдоним).alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'
У меня была такая же проблема. Я нашел этот псевдоним (.gitconfig)
[alias] track = "!git branch --set-upstream-to=origin/`git symbolic-ref --short HEAD`"
Использование:
git track
один раз для каждой новой ветки (в настоящее время проверено). Тогда просто нажимай как обычно :)источник
Ответы @VonC и @Frexuz полезны, но оба их решения вызывают для меня ошибку. Используя оба их ответа, я сколотил то, что мне подходит:
Это приводит к выполнению либо,
git push -u origin $BRANCHNAME
либоgit push
, в зависимости от того, определено ли его восходящее (свойствоbranch.$BRANCHNAME.merge
).Для ввода этого псевдонима в командной строке потребуются escape-коды, поэтому, вероятно, проще всего использовать редактор для вставки в правильный файл (
$HOME/.gitconfig
(глобальный),.git/config
(локальный) или/etc/gitconfig
(системный))источник
git config --global -e
Я решил эту проблему с помощью этого простого скрипта Bash. Это не будет работать с существующими ветками, но если вы создадите все свои ветки с помощью этой функции, у вас всегда будет автоматически устанавливаться исходная ветка.
$ 1 представляет собой первый аргумент, который вы передаете после,
con
так что это примерно так:... просто сделав это:
источник
Короткий ответ
Если вы действительно хотите быть явным и использовать эту
-u
опцию при необходимости, но просто не хотите вводить все:Затем вы можете использовать следующий псевдоним:
И просто введите:
Длинный ответ
Обычно потребность в
-u
(сокращении для--set-upstream
) возникает тогда, когда мы только что создали новую локальную ветвь и зафиксировали, и мы хотим отправить ее вверх по течению. В удаленном репозитории еще нет новой ветки, поэтому нам нужно указать git, что нужно создать и отслеживать удаленную ветку, прежде чем отправлять фиксацию. Это необходимо только для первого нажатия на ветку. Вот типичный сценарий:Лично мне нравится необходимость явного указания
git push -u
при создании удаленной ветки: это довольно важная операция - предоставить миру совершенно новую ветку.Однако я ненавижу то, что мы должны явно писать
git push -u origin foo
. Мало того, что печатать это сложно, но, что более важно, это довольно чревато ошибками! При вводе имени ветки легко ошибиться, и новая удаленная ветка не будет иметь то же имя, что и ваша локальная ветка! В большинстве случаев вы действительно хотите, чтобы исходный репозиторий былorigin
, а восходящая ветка имела то же имя, что и ваша локальная ветка.Поэтому я использую следующий псевдоним в моем
.gitconfig
, который является подмножеством отличного ответа, предоставленного Марком :Теперь мы можем сделать следующее, которое все еще явное, но менее подвержено ошибкам:
источник
Просто:
источник
git push -u
, но ...». Так что это не ответ на вопрос.Если вы хотите использовать встроенные функции git только с менее возможным нажатием клавиш, просто введите:
$ git push -u o
tabH
tabи автозаполнение даст вам
$ git push -u origin HEAD
Чтобы включить autocomplate на OSX создать
~/.git-completition.bash
файл с таким содержимым и добавьте следующие строки в~/.bash_profile
файл и перезапустите ваш терминал:Это влияет и на встроенные терминалы, например, в vscode и т. Д.
источник
git-completition.bash
и добавил к своему ответу.Я сделал расширение git с полезными скриптами, включая этот:
https://github.com/jvenezia/git-line
источник
Если по какой-либо причине ни один из других ответов у вас не работает, вы можете заменить
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 .
источник