2013-07-25 50 views
41

我希望git push origin在我第一次推送本地創建的分支時自動設置上游引用。如何配置git推動自動設置上游沒有-u?

我知道git push -u,但我不想考慮我以前是否使用過-u或者設置了上游參考。換句話說,我希望git push在尚未有上游的分支的任何推動上自動產生git push -u的效果。

這可能嗎?如果它需要別名或實用程序腳本,那很好。

+1

你檢查,如果有可能使用'push.default'和'分支。 [git-config(1)](https://www.kernel.org/pub/software/scm/git/docs/git-config.html)中的 .merge'選項? – 2013-07-25 01:08:48

+0

我將'push.default'設置爲'current' - 這就是我可以在沒有refspec或上游的情況下說'git push origin'。但它無助於自動設置上游。 – John

回答

20

因爲我不認爲這是可能的使用混帳配置,這裏是你可以在bash做什麼:

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

如果當前分支具有遠程跟蹤分支,它調用git push否則調用git push -u

+1

您現在可以執行'git config --global push.default current'。 –

16

注:以下事實new default push policy "simple"依賴於具有上游一個分支意味着:
設置的上游分支被看作是自願步驟,而不是隱藏的自動化一個

當「git push [$there]」不說推什麼,我們已經使用了傳統的「匹配」的語義至今(所有的分支都只要遙遠,目前已經有同名的分支那邊發送到)。

我們將使用「simple」語義將當前的分支具有相同名稱的分支,僅在當前分支被設定爲與遠程分支整合。
有一個用戶首選項配置變量「push.default」來改變這一點。


所以從mechanicalfishanswer建立,可以定義一個別名,用正確的雙引號(")逃脫(\"):

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

git pu origin 

Sc0ttyD提出in the comments以下別名:

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' 
+0

感謝您展示如何設置別名。雖然我不清楚你的答案的第一部分的連接或相關性。 – John

+1

@John我的觀點是:你會繞過一個本應該是故意的步驟。你可以設置別名,但是我想向其他讀者說明爲什麼這個顯式的'-u'選項存在,爲什麼沒有配置使所述選項自動(因此是別名)。 – VonC

+0

我在我的.zshrc中有一個zsh別名列表。我修改了這個答案來創建下面的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

10

我有同樣的問題。我發現這個別名(的.gitconfig)

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

用法:每次新的分支git track一次(當前已簽出)。然後只是像往常一樣推:)

8

@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 $BRANCHNAMEgit push,取決於其上游(財產branch.$BRANCHNAME.merge)是否定義。

進入命令行上此別名將需要換碼,所以它可能是最容易使用編輯器插入正確的文件($HOME/.gitconfig(全球),.git/config(本地),或/etc/gitconfig(系統))

+2

這是最直接和最完整的答案。要打開默認編輯器而不搜索文件,你可以'git config --global -e' –

-1

只需:

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

問題標題:「如何配置git push來自動設置沒有-u的上游?描述:「我知道'git push -u',但是...」。所以這不能回答這個問題。 – John

+1

@John我更新了我的答案,建議一個簡單的別名。 – djanowski

+1

@John現在是否回答這個問題? – djanowski

1

我使用這個簡單的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 
0
git fetch origin 
git push origin 

^這把逆流我