2016-04-27 17 views
0

特定のリビジョン(RevXなど)でgit repo(Repoと言う)クローンを作成しています。 そして私はRevoでRepoAのコードのための "git patch"ファイル(パッチ1と言う)を持つ別のリポジトリ(RepoB)を持っています。Gitは上記の特定のリビジョンの場合にのみ適用する

誰かがRepoAのコードを新しいリビジョン(RevY)に更新しました。これは、私のパッチファイルが今や失敗するようなものです。 RevY用の新しいパッチファイル(Patch2など)を作成しました。

私の質問:シェルスクリプトで、RepoAのローカルコピーがRevYより前の場合はPatch1を適用し、RepoAのローカルコピーがRevYより後の場合はPatch2を適用します。

どうすればいいですか?

EDIT: RevX

RevX + 1

RevX + 2

...

RevX + N:たとえばRevXとレヴィとの間の複数のリビジョン..があり得ます

RevY

Rev Y + 1

答えて

0

git rev-parse HEADを使用して、現在のリビジョンを判断し、Patch1またはPatch2を適用することができます。

+0

範囲でどのように使用できますか?どのように私は現在のものが "前"か "後" RevYかどうかを知ることができますか? –

+0

git rev-listを解析しようとしましたか? – blatinox

0

あなたはまた、ハッシュを印刷し、10の直近のコミットのメッセージをコミットしますgit log

git log --pretty=oneline HEAD~10..HEAD 

これを試すことができ、あなたはより多くを印刷するために、上記の番号を変更することができます。次に、RevXRevYのリストを検索できます。

しかし、私は別のワークフローを示唆している:

Checkout the specific `Rev` -> Apply the patch -> Commit -> Merge with the newest commit 
0

あなたが尋ねた質問への直接的な解決策があります:コミット-IDをかどうかAgit merge-base --is-ancestor ABテストがそう、コミット-ID Bの祖先であるが、現在のコミットが、必要なパッチを変更することが知られているコミットの祖先であるかどうかを簡単にテストできます。 Aは、特定の先祖であるコミットB、ない「いくつかのコミットそのがをコミットとしてそれが同じ変更を行うコミット:

この方法の問題点は、それがテストだけで何それは言うテストということですB "。誰かがチェリーピックをコミットするとBのように同じ変更が行われますが、新しい(異なる)コミットIDが設定されます。古いパッチは失敗し、代わりに新しいパッチが必要になりますが、そのブランチにはコミットB自体は含まれていません。ちょうど何か相当のです。

このような状況が重要でない場合は、merge-base --is-ancestorテストを使用できます。それ以外の場合は、さまざまなシグネチャのパッチを適用するコードを調べるなどの異なる戦略をアドバイスします(たとえば、「関数呼び出しの近くのコードf()がバージョンAのように見える場合はパッチAを使用し、Bの場合はパッチを使用しますB; CまたはDのように見える場合はPatchCDを使用し、固定バージョンEのように見える場合は何もしないでください。そうでない場合は、このバージョンをどのように修正するかわかりません)。

関連する問題