2011-11-09 5 views
1

私はgitに基づいたツールを書こうとしていますが、幾分珍しいことをしています。それでは、git merge --ff-only [remote-branch]の複数のインスタンスを一度に実行して、最新のコミットを入手するのは安全ですか?すべてのリモコンは、同じ行のコミットになります。私は私のツールでそれらをすべて生成し、それを並べ替えることができるようにしたいと思いますが、これが問題を引き起こすかどうかを知る必要があります。誰かがgit内部について何らかの方法で十分に知っていますか?'git merge'の複数の呼び出しを同時に実行することはできますか?

+0

ユースケースについて少し詳しく説明できますか?異なるリモコンに相反する変更がありますか? 'git fetch'を実行し、' git log'を使って最新のものを正統に選ぶベースラインを得ることができませんでしたか? – Romain

+0

私はいくつかのデータを複数のマシンに分散するためにgitを使用しています。新しいコミットの唯一の究極のソースがあるため、競合は発生しません。リモートブランチブランチが新しいものかどうかを確認し、もしあればマスターブランチと作業コピーを更新するので、 "Merge"は実際には誤った名前です。ほとんどのマージはno-opsになりますが、時には更新が伝播し、まれに2つまたは3つのリモートがあり、それぞれ同じ更新コミットを同じ時刻に持つこともあります。 –

+0

次に、すべてのリモートから 'git fetch'を実行して、' git merge --rebase'を実行して、先ほど取得した最も遠いリモートヘッドを選択します。 – Romain

答えて

1

を言って、正常に戻さgit branch --containsまたは他の方法で古いコミットが到達可能かどうかを確認してから、resetまたはupdate-refを実行しますか?

これは非常に高速で、作業ディレクトリの更新を避けることができます。

+0

ありがとうございます、実際には本当に便利ですね! –

1

Gitは同時アクセスを防ぐためにロックを使用します。最悪の場合、マージの試行は失敗し、lock file existsというエラーが表示されます。

ところで、マージで複数のマージを許可すると、タコのマージ戦略があります。

+0

Octopusのマージはクールですが、OPはタコの場合には決して起こらない '--ff-only'と言いますが、右? – Romain

+0

@Romainはい、おそらく...しかし、すべての支店が同じコミット(つまり、お互いのバックアップコピーのようなもの)を持っていたら、それはうまくいくかもしれませんが、私は自分自身を試していないと疑問を持っています... – kan

+0

タコmergeはマージされている各コミットのすべてのrefを含むMERGE_HEADを作成します。 –

0

この状況では、同時にリモートブランチを作成するのではなく、各リモートブランチを順番にマージするのはなぜですか?

#!/bin/sh 
set -e 
for rtb in origin/master github/master gitorious/master 
do 
    git merge --ff-only $rtb 
done 

HEADがすでにリモート追跡分岐の1つが含まれている場合は、なぜあなただ​​け検査していない、マージはまだ、あなたは--ffのみのマージ行っている場合Already up-to-date.

+0

私はそれをやっていますが、IOがうまく動かなければ、「git merge」は無作為に1分以上かかることがあるので、このスレッドの責任を他の何かにもたせることができたかったのです。私は、すべてのマージを独自のスレッドに入れて、シリアライズし、それを使って完了させることができます。 –

+0

右。マージが必要な場合には、コミット・グラフを走査する際にIOがほとんど必要ありません。ほとんどの場合、I/Oの大半は、早送りマージが必要であることを見つけた後、新しいコミットを実際にチェックアウトしていると思われます。その場合、最善の勝利は最新のコミットを見つけて、 。 –

関連する問題