39

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

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

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

4

6 に答える 6

21

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

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

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

を実行して、すべてのブランチのアップストリームブランチが正しく設定されていることを確認します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;
于 2014-06-27T11:59:11.813 に答える
6

ちょっと待って:

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


注:Git 2.0(2014年第2四半期)では、 commitb814da8でconfigpush.ffが導入されます。

pull.ff::

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

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

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

于 2013-09-15T21:57:11.147 に答える
5

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

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

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

于 2019-04-15T18:21:01.990 に答える
0

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

于 2011-01-02T12:20:32.067 に答える
0

そのための小さなツールを作成しました。https://github.com/changyuheng/git-fast-forward-all

このツールの利点:

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