-uなしで自動的に上流を設定するようにgit pushを構成するにはどうすればよいですか?


100

git push originローカルで作成したブランチを初めてプッシュするときに、アップストリームリファレンスを自動的に設定したいのですが。

についてgit push -uは知っていますが、-u以前に使用したことがあるか、そうでない場合は上流参照を設定したことがあるかどうかを考える必要はありません。言い換えると、まだ上流にないブランチのプッシュgit pushに自動的に影響を与えたいですgit push -u

これは可能ですか?エイリアスまたはユーティリティスクリプトが必要な場合は問題ありません。


2
push.defaultgit-config(1)のbranch.<name>.mergeオプションを使用できるかどうかを確認しましたか?

5
私はpush.default設定しましたcurrent-それは私がgit push originrefspecまたはアップストリームなしでちょうど言うことができる方法です。しかし、それは自動的に上流を設定することには役立ちません。
ジョン

回答:


61

git config使用して設定できますgit config --global push.default current

ドキュメント:https : //git-scm.com/docs/git-config/#Documentation/git-config.txt-pushdefault


8
私はそのセットを持っています-それは私がgit push originrefspecまたはアップストリームなしでちょうど言うことができる方法です。しかし、それは自動的に上流を設定することには役立ちません。
ジョン

私のために働く:+1:
Tim Strijdhorst

ええ、@ Johnが言うように、これはローカルブランチをリモートブランチに追跡させないことを覚えておくことが重要です。ローカルブランチと同じ名前でリモートブランチを作成するだけです。
危険な

必要なだけの場合は十分です。pushたとえば、彼のブランチには1人の開発者だけがいて、その開発者はリポジトリのコピーを1つだけ編集します。
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
Andrea Bergonzo

2
@AndreaBergonzoこれが私への唯一の良い答えです、それを答えとして追加してもらえますか?
pdem

6
@ AndreaBergonzo、@ pdem- push.default=currentローカルブランチと同じ名前のリモートリポジトリにブランチを作成するだけで、リモートブランチを追跡するようにローカルブランチを設定しないことに注意してください。なぜそうなのかはわかりませんが、覚えておく価値はあります。
騒々しい

22

注:新しいデフォルトのプッシュポリシー「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'

1
エイリアスの設定方法をご紹介いただきありがとうございます。私はあなたの答えの最初の部分との関係や関連性についてははっきりしていません。
John

2
@ジョン私のポイントは、次のとおりです。意図的なステップであるはずのステップを回避します。あなたはそのエイリアスを設定できますが、この明示的な-uオプションが存在する理由と、そのオプションを自動にするための構成がないため(したがってエイリアス)、他の読者に明確にしたかったのです。
VonC 2013

2
.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

2
@ Sc0ttyD興味深い、ありがとうございます。見やすくするために、回答にコメントを含めました。
VonC 2017年

17

同じ問題がありました。このエイリアス(.gitconfig)を見つけました

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

使用法:git track新しいブランチごとに1回(現在チェックアウトされています)。次に、通常どおりにプッシュします:)


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 $BRANCHNAMEgit 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、アップストリームブランチをローカルブランチと同じ名前にする必要があります。

したがって、私は次のエイリアスをmy .gitconfigで使用しています。これは、Markが提供する優れた回答のサブセットです。

[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
質問のタイトル:「アップストリームを-uなしで自動的に設定するようにgit pushを構成する方法」説明:「知っているgit push -uが…」だからこれは質問に答えません。
John

2
@ジョン私は簡単なエイリアスを提案するために私の答えを更新しました。
djanowski 2016

2
@ジョンそれは今の質問に答えますか?
djanowski 2016

1
@ ILI4SK4RIMおかげで、私の答えが最も簡単な答えであることに夢中ですが、それでも-1です¯_(ツ)_ /
¯– djanowski


1

組み込みのgit機能をあまり使用できないキーでのみ使用する場合は、次のように入力します。

$ git push -u o tab H tab

オートコンプリートで $ git push -u origin HEAD

OSXでautocomplateを有効にするには、このコンテンツを含む~/.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-completion.bashの内容がわからなければ、答えを操作することはできません。
vy32

1
いい視点ね。私は自分の出所を見つけ、git-completition.bash私の答えに加えました。
gazdagergo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.