Як налаштувати git push для автоматичного встановлення вгору за течією без -u?


100

Я хочу git push originавтоматично встановити вихідне посилання, коли вперше натискаю на створену локально гілку.

Я знаю про це git push -u, але я не хочу думати про те, чи використовував я -uраніше, чи не встановлював іншим посиланням вище. Іншими словами, я хочу git pushавтоматично впливати git push -uна будь-який поштовх гілки, яка ще не має вищого потоку.

Чи можливо це? Якщо для цього потрібен псевдонім або скрипт утиліти, це добре.


2
Чи перевіряли ви, чи можна використовувати параметри push.defaultта branch.<name>.mergeв git-config (1) ?

5
Я push.defaultналаштувався current- ось як я можу просто сказати git push originбез refspec або вище. Але це не допомагає з автоматичним налаштуванням вищого рівня.
Джон

Відповіді:


61

Ви можете налаштувати його за git configдопомогою git config --global push.default current.

Документи: https://git-scm.com/docs/git-config/#Documentation/git-config.txt-pushdefault


8
У мене є такий набір - ось як я можу просто сказати git push originбез refspec або вище. Але це не допомагає з автоматичним налаштуванням вищого рівня.
Джон

Працює для мене: +1:
Тім Стрийдхорст

Так, як каже @John, важливо мати на увазі, що це не змушує локальну гілку відстежувати віддалену; він просто створює віддалену гілку з тим самим іменем, що і локальна.
розгульний

Досить добре, якщо вам це просто потрібно push, наприклад, у його гілці знаходиться лише один розробник, який редагує лише одну копію репо.
superarts.org

26

Оскільки я не думаю, що це можливо за допомогою git config, ось що ви можете зробити в bash:

[[ $(git config "branch.$(git rev-parse --abbrev-ref HEAD).merge") = '' ]] && git push -u || git push

Якщо поточна гілка має віддалену гілку відстеження, вона викликає git pushінше, що викликає git push -u


24
Тепер ви можете це зробити git config --global push.default current.
Андреа Бергонцо,

2
@AndreaBergonzo це єдина хороша відповідь для мене, чи можете ви додати її як відповідь?
pdem

6
@AndreaBergonzo, @pdem - зауважте, що push.default=currentлише створює гілку у віддаленому сховищі з тим самим іменем, що і локальна гілка, але не встановлює локальну гілку для відстеження віддаленої. Я не впевнений, чому це так, але варто пам’ятати.
вальдріозний

22

Примітка: той факт, що нова політика " simple" за замовчуванням " покладається на гілку, яка має вищу", означає, що:
встановлення висхідної гілки розглядається як добровільний крок, а не як прихований автоматизований

Коли " git push [$there]" не говорить, що натискати, ми використовували традиційну "відповідну" семантику (усі ваші гілки були відправлені на пульт, якщо там вже є гілки з однойменною назвою).

Ми будемо використовувати " simple" семантику, яка підштовхує поточну гілку до гілки з тим самим ім'ям, лише коли поточну гілку встановлено для інтеграції з цією віддаленою гілкою .
Існує змінна конфігурації налаштувань користувача " push.default", щоб змінити це.


Так побудови з mechanicalfish «s відповіді , ви можете визначити псевдонім, з правом подвійних лапок ( ") екрановані ( \"):

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'

1
Дякуємо, що показали, як налаштувати псевдонім. Хоча мені незрозуміло зв’язок з першою частиною вашої відповіді чи її відповідність.
Джон

2
@ Джон, я хочу сказати: ви обійшли б крок, який, як передбачається, був навмисним. Ви можете налаштувати цей псевдонім, але я хотів пояснити іншим читачам, чому -uіснує ця явна опція, і чому не існує конфігурації для автоматичного здійснення зазначеної опції (звідси псевдонім).
VonC

2
У мене є список псевдонімів zsh у моєму .zshrc. Я змінив цю відповідь, щоб створити наступний псевдонім zsh:alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'
Sc0ttyD

2
@ Sc0ttyD Цікаво, дякую. Я включив ваш коментар у відповідь для більшої наочності.
VonC

17

У мене була та сама проблема. Я знайшов цей псевдонім (.gitconfig)

[alias] track = "!git branch --set-upstream-to=origin/`git symbolic-ref --short HEAD`"

Використання: git trackодин раз за нову гілку (зараз перевірено). Тоді просто натискайте як зазвичай :)


15

Відповіді @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 ).

Введення цього псевдоніма в командному рядку вимагатиме екрануючих кодів, тому, мабуть, найпростіше скористатися редактором, щоб вставити у правильний файл ( $HOME/.gitconfig(глобальний), .git/config(локальний) або /etc/gitconfig(системний))


3
Це найбільш пряма і повна відповідь. Щоб відкрити редактор за замовчуванням, не шукаючи файл, ви можетеgit config --global -e
Адам Толлі

5

Коротка відповідь

Якщо ви насправді хочете бути явним і використовувати -uопцію, коли це необхідно, але просто не хочете вводити ціле:

git push -u origin foo

Тоді ви можете використовувати наступний псевдонім:

[alias]
    push-u = !git push -u origin $(git symbolic-ref --short HEAD)

І просто введіть:

git push-u

Довга відповідь

Як правило, потреба в -u(скороченому слові --set-upstream) - це коли ми щойно створили нову локальну гілку та здійснили коміт, і ми хочемо підштовхнути її до потоку. У віддаленому сховищі ще немає нової гілки, тому нам потрібно сказати git створити та відстежувати віддалену гілку перед натисканням коміту. Це потрібно лише для першого натискання на гілку. Ось типовий сценарій:

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, а гілка вгору за течією мала те саме ім’я, що і ваша локальна гілка.

Тому я використовую наступний псевдонім у своєму .gitconfig, що є підмножиною чудової відповіді, наданої Марком :

[alias]
    push-u = !git push -u origin $(git symbolic-ref --short HEAD)

Тепер ми можемо зробити наступне, що все ще є явним, але менш схильним до помилок:

git checkout -b foo         # Create local branch
git commit -m "Foo"         # Create local commit
git push-u                  # Create and track remote branch, and push commit
git commit -m "Bar"         # Create local commit
git push                    # Push commit

4

Я вирішив цю проблему за допомогою цього простого сценарію 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

2

Просто:

$ alias gush="git push -u origin HEAD"

2
Заголовок питання: "Як налаштувати git push для автоматичного встановлення вгору за течією без -u?" Опис: "Я знаю про git push -u, але ...". Отже, це не відповідає на питання.
Джон

2
@John Я оновив свою відповідь, запропонувавши простий псевдонім.
djanowski

2
@ John Чи відповідає це питання зараз?
djanowski

1
@ ILI4SK4RIM Дякую, божевільно, що моя відповідь найпростіша, однак це -1 ¯_ (ツ) _ / ¯
djanowski


1

Якщо ви хочете використовувати вбудовані функції 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 тощо.


автозаповнення? git не має автозаповнення. У вашій оболонці (bash? Zsh?) Завантажено набір правил автозаповнення. Чи можете ви надати інформацію щодо того, який набір правил автозаповнення ви використовуєте, і де їх отримати?
vy32

О, на ділі дякую. Я доповнив свою відповідь своїми налаштуваннями автозаповнення.
gazdagergo

Не знаючи вмісту вашого файлу ~ / .git-завершення.bash, ваша відповідь не може бути здійснена.
vy32

1
Гарна думка. Я знайшов джерело свого git-completition.bashі додав до своєї відповіді.
gazdagergo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.