web-dev-qa-db-ja.com

Git-プル時にすべてのトラッキングブランチを自動的に早送りします

--trackオプションを使用してトラッキングブランチを設定しました。mastergit pullを実行すると、すべてのブランチがOrigin/branchnameにフェッチされますが、マージされません。ローカル追跡ブランチ。後でmastergit Pushを実行すると、非早送りの更新がトラッキングブランチで拒否されたと表示されるため、これは非常に面倒です。初期git pull

私の質問は次のとおりです:git pullですべてのブランチをフェッチし、すべてのトラッキングブランチを自動的に早送りするようにするにはどうすればよいですか?

注:git pullは、GitHubリポジトリを使用してすべてのトラッキングブランチを早送りしていましたが、Gitoliteを使用して独自のリポジトリを設定したため、この問題が発生しています。

33
Chetan

ちょっと待って:

注:「 すべてのリモートgitブランチをローカルブランチとして追跡します。 」のように、すべてのリモートブランチを追跡したと思います。


注:Git 2.0(2014年第2四半期)では、 commit b814da8 構成Push.ffが導入されます。

pull.ff::

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

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

チェックアウトを行わずに、アップストリームブランチが一致するオリジン/ブランチに設定されているすべてのブランチを早送りするシェルスクリプト

  • 現在のブランチはいつでも変更されません。作業コピーの変更やチェックアウトの時間のロスに対処する必要はありません。

  • 早送りのみを行い、早送りできないブランチはエラーメッセージを表示し、スキップされます

git branch -vvを実行して、すべてのブランチのアップストリームブランチが正しく設定されていることを確認します。 git branch -u Origin/yourbanchnameでアップストリームブランチを設定します

ファイルとchmod755にコピーアンドペーストします。

#!/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;
15
qwertzguy

リモートブランチを追跡しているすべてのローカルブランチを本当に早送りしたい場合は、これをエイリアスとして~/.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を実行します。

5
Jörn Hees

次のワンライナーは、可能であればアップストリームブランチを持つすべてのブランチを早送りし、そうでない場合はエラーを出力します。

git branch \
  --format "%(if)%(upstream:short)%(then)git Push . %(upstream:short):%(refname:short)%(end)" |
  sh

それはどのように機能しますか?

git branchコマンドでカスタムフォーマットを使用します。アップストリームブランチを持つブランチごとに、次のパターンで行を出力します。

git Push . <remote-ref>:<branch>

これはshに直接パイプできます(ブランチ名が整形式であると仮定します)。 | shを省略して、何が行われているかを確認します。

警告

現在チェックアウトされているブランチは、次のようなメッセージで更新されません。

! [remote rejected] Origin/master -> master (branch is currently checked out)

このために、通常のgit pull --ff-onlyに頼ることができます。

エイリアス

.gitconfigに以下を追加して、git fftがこのコマンドを実行するようにします。

[alias]
        fft = !sh -c 'git branch --format \"%(if)%(upstream:short)%(then)git Push . %(upstream:short):%(refname:short)%(end)\" | sh' -

エイリアスは「早送り追跡(ブランチ)」の省略形です。

2
krlmlr

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

0
Mot

そうするための小さなツールを書いたところです。 https://github.com/changyuheng/git-fast-forward-all

このツールの利点:

  1. 1つのリポジトリで複数のリモートをサポートします。 (hub sync現在、複数のリモコンはサポートされていません。)
  2. ローカルブランチと対応するリモートトラッキングブランチで異なる名前を持つことをサポートします。
  3. すべてのブランチに対してリモートをフェッチする他のスクリプトよりもはるかに高速です。
  4. エラーが発生しやすい正規表現の解析/編集はありません。
0
changyuheng