2011-01-02 5 views
29

--trackオプションでトラッキングブランチを設定しました。mastergit pullを実行すると、すべてのブランチをorigin/branchnameにフェッチしますが、ローカルトラッキングブランチとマージしません。後でgit pushmasterに送信すると、最初のgit pullで早送りされなかったため、早送り以外の更新が追跡ブランチで拒否されたため、これは厄介なことです。Git - すべてのトラッキングブランチを自動的に早送りします。

私の質問はgit pullはすべてのブランチをフェッチし、自動的にすべてのトラッキングブランチを早送りするようにしますか?

注:私のGitHubのリポジトリを持つすべての私の追跡ブランチ早送りが、今私はGitoliteを使用して自分のレポを設定したことを、この問題は、最大トリミングさに慣れgit pull

+0

あなたが使用している正確なコマンドを表示することができますか? 'master'ブランチで' git push'を実行すると、マスターブランチ以外のものをプッシュする必要があります。マスターに変更を加えていない場合は、押してみるべきではありません。 –

+1

あなたのワークフローは正確にはわかりませんが、すぐに反応するのは、ローカルトラッキングブランチを作成する必要がないということです(早送りが可能な場合など)。リモート追跡ブランチ( 'origin/*')は自動的に更新され、どんな場合でも参照用に利用できます。 –

+0

@CharlesBaileyここにいくつかの例があります:複数の開発者がブランチのセットを共有し、少なくとも時々それらのすべてを処理しますが、通常はほとんどのブランチを高速転送することができます。 – bames53

答えて

5

しかし、待って:枝が最初にチェックアウトされていない限り

注:私は、あなたが "Track all remote git branches as local branches."


ノートのように、すべてのリモートブランチを追跡していたとします

:Gitの2.0(Q2 2014) commit b814da8で設定push.ffをご紹介します
pull.ff:: 

デフォルトでは、Gitは現在のコミットの子孫であるコミットをマージするときに余分なマージコミットを作成しません。代わりに、現在のブランチの先端が早送りされます。 falseに設定すると

  • 、この変数は(コマンドラインから--no-ffオプションを与えることに相当)、このような場合にはコミット余分なマージを作成するためのGitに指示します。
  • onlyに設定すると、そのような早送りマージのみが許可されます(コマンドラインから--ff-onlyオプションを指定した場合と同じです)。
0

SmartGit、たとえば、あなたがブランチに切り替えた場合、自動的に追跡ブランチからの変更をマージするためのオプションがあります。これは達成したいことをするはずです。

+0

この特定のスクリプトは、現在のブランチを変更するという望ましくない副作用もあります。現在のブランチを維持するためにそれを変更する方法はありますか? –

1

あなたが本当に楽しみ、あなたの~/.gitconfigへのエイリアスとしてこれを追加することを検討することをお勧めしますリモートブランチを追跡しているすべてのローカル枝を高速にしたい場合:

[alias] 
    pull-all = !"for b in $(git for-each-ref refs/heads --format='%(refname)') ; do git checkout ${b#refs/heads/} ; git pull --ff-only ; done" 

あなたはその後、git pull-allを実行することができ、それが反復処理されますあなたの地方の支部を開き、それぞれにgit pull --ff-onlyを実行してください。

+1

'checkout'は望ましくないかもしれません。なぜなら作業ツリーを更新する必要があるからです。これはIDEや他の人がファイルを見ている更新を引き起こすかもしれません。それを避けるために、代わりに 'update-ref'を使うことができます:http://stackoverflow.com/questions/5147537/how-do-i-fast-forward-other-tracking-branches-in-git# 5148202 – joeytwiddle

+0

私はトラッキングブランチがorigin_branch:$ merit-all =!のために$(git for-each-ref参照/ head --format = \ "%(refname:short) ($ git rev-parse --verify \ "$ local_branch \"); remote_commit = $(git rev-parse --verify \ "$ remote_branch \"; \ "$ common_ancestor \" = \ "$ local_commit \"]; echo \ "早送りすることはできません:$ local_branch \ local_branch \ remote_branch \ ">&2;そうでなければgit update-ref refs/heads/$ local_branch $ remote_commit $ local_commit; fi done" – joeytwiddle

8

早送りその上流分岐が任意のチェックアウト

  • を行わず、一致する起源/ブランチに設定されているすべてのブランチが、それは、いつでもする必要はありませんが、あなたの現在のブランチを変更しませんシェルスクリプトそれだけ早送りを行い

  • をチェックアウトして失われた作業コピーの変更や時間を扱う、早送りすることはできません支店は、エラーメッセージが表示され、

01をスキップされます

git branch -vvを実行して、すべてのブランチの上流ブランチが正しく設定されていることを確認してください。ファイルとchmod 755へコピー・ペーストしgit branch -u origin/yourbanchname

と上流分岐を設定します。

#!/bin/sh 

curbranch=$(git rev-parse --abbrev-ref HEAD) 

for branch in $(git for-each-ref refs/heads --format="%(refname:short)"); do 
     upbranch=$(git config --get branch.$branch.merge | sed 's:refs/heads/::'); 
     if [ "$branch" = "$upbranch" ]; then 
       if [ "$branch" = "$curbranch" ]; then 
         echo Fast forwarding current branch $curbranch 
         git merge --ff-only origin/$upbranch 
       else 
         echo Fast forwarding $branch with origin/$upbranch 
         git fetch . origin/$upbranch:$branch 
       fi 
     fi 
done; 
関連する問題