--track
オプションを使用してトラッキングブランチを設定しました。master
でgit pull
を実行すると、すべてのブランチがOrigin/branchname
にフェッチされますが、マージされません。ローカル追跡ブランチ。後でmaster
でgit Push
を実行すると、非早送りの更新がトラッキングブランチで拒否されたと表示されるため、これは非常に面倒です。初期git pull
。
私の質問は次のとおりです:git pull
ですべてのブランチをフェッチし、すべてのトラッキングブランチを自動的に早送りするようにするにはどうすればよいですか?
注:git pull
は、GitHubリポジトリを使用してすべてのトラッキングブランチを早送りしていましたが、Gitoliteを使用して独自のリポジトリを設定したため、この問題が発生しています。
ちょっと待って:
fetch
部分の後のgit pull
の2番目のステップ)。 「 「git pull --all
」はすべてのローカルブランチを更新できますか? "を参照してください。master
のgit pull
はmaster
のファイルをマージします。つまり、次のプッシュは早送りになります。非早送りが発生する可能性があるのは リモートへのプッシュmaster
別のリポジトリからがyourプッシュの前に行われた場合 =。注:「 すべてのリモートgitブランチをローカルブランチとして追跡します。 」のように、すべてのリモートブランチを追跡したと思います。
注:Git 2.0(2014年第2四半期)では、 commit b814da8 構成Push.ffが導入されます。
pull.ff::
デフォルトでは、Gitは、現在のコミットの子孫であるコミットをマージするときに、追加のマージコミットを作成しません。代わりに、現在のブランチの先端が早送りされます。
false
に設定すると、この変数はGitにそのような場合に追加のマージコミットを作成するように指示します(コマンドラインから--no-ff
オプションを指定するのと同じです)。only
に設定すると、そのような早送りマージのみが許可されます(コマンドラインから--ff-only
オプションを指定するのと同じです)。
チェックアウトを行わずに、アップストリームブランチが一致するオリジン/ブランチに設定されているすべてのブランチを早送りするシェルスクリプト
現在のブランチはいつでも変更されません。作業コピーの変更やチェックアウトの時間のロスに対処する必要はありません。
早送りのみを行い、早送りできないブランチはエラーメッセージを表示し、スキップされます
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;
リモートブランチを追跡しているすべてのローカルブランチを本当に早送りしたい場合は、これをエイリアスとして~/.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
を実行します。
次のワンライナーは、可能であればアップストリームブランチを持つすべてのブランチを早送りし、そうでない場合はエラーを出力します。
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' -
エイリアスは「早送り追跡(ブランチ)」の省略形です。
SmartGit たとえば、ブランチに切り替えると、追跡されたブランチからの変更を自動的にマージするオプションがあります。これはあなたが達成したいことをするはずです。
そうするための小さなツールを書いたところです。 https://github.com/changyuheng/git-fast-forward-all
このツールの利点:
hub sync
現在、複数のリモコンはサポートされていません。)