2011-07-08 2 views
1

ある時点で、スクリプト/プラグインをインストールしてgit repoからコピーされたRailsプラグインがあります。その後、ローカルパッチが追加されました。今度は、オリジナルのプラグインの独自のリポジトリのfork内の別のブランチとしてコードを維持したいと考えています。repo-lessコードの分岐点を見つける

git repoとコードツリーがあれば、新しいコードに最も近いコミットを見つけるのにどのような方法が良いでしょうか? diff線の合計量を最小限に抑える?

+0

「ローカルパッチが追加されましたか?複製されたレポに取り組み、それらをコミットしていたのですか、または変更を一括して適用し、コードを今すぐ持っていましたか? – shelhamer

+0

変更の束はスーパープロジェクトのレポに適用されたので、履歴を知っていて、プラグインの最も古いバージョンを取得することができます。プラグイン自身のリポジトリに何がコミットしているのか分かりません。 – Alexy

+0

これについてもっと考えてみて、git hash-objectのドキュメントを検索しました。これは、ファイルとその内容のハッシュ・ブロブを生成します。あなたは履歴があり、最も古いバージョンを取得できるので、「元の」ファイルのハッシュ・ブロブを計算して、所有者のレポの履歴で見つけることができます。 – shelhamer

答えて

1

リポジトリをクローンしたときにタイムスタンプを回復できる場合は、そこから最も近いコミットを参照してそこから分岐します。さもなければ、あなたは毛むくじゃらの時間を持つつもりです。

あなたのコードとgit repoとの間の最小編集距離は、NP困難な問題です。この場合、ツリー差分と各git BLOBの編集距離が必要なので、悪い例です(つまり、コードファイルやその他のオブジェクト)を削除します。

git-tree-diffの助けを借りて、乾草の針を見つけることができます。最初に、プラグインのレポをクローンし、ブランチを作成し、その上にすべての変更をコミットします。 tree-diffはその差を見積もりますが、コミットするたびにこれを繰り返さなければなりません。それは地獄でしょう。

代わりに、あなたの現在のコードを取って、プラグインレポのマスターのHEADから1つの大きな違いを得ることができるようにしてから、できるだけsplit your changes into as many atomic commitsを試してください。

それは痛いですが、あなたはそれの終わりを見るかもしれません。

編集:ここでは扱いにくいことがあるかもしれませんが、ここでも迷惑です。あなたが履歴を持っていて、最も古いバージョンを得ることができるので、 "元の"ファイルのgitハッシュブロブを計算し、それらをオーナーのレポの履歴で見つけることができます。あなたの履歴では、変更を加える前にプラグインをチェックしてください。これにより、個々のファイルとそのコンテンツのブロブハッシュを計算できます。次に、あなたが見つけたブロブハッシュの公式レポでgitの履歴を検索することができます。これは、プラグインファイルが最初にインストールされた時の時点で、特にどのコミットでどの時点で実行されたのかを識別します。次に、最も古いコミットを比較して見つけることができます。

kernel.org git docsだけでこれを行うための例を提供します。

git log --raw --abbrev=40 --pretty=oneline | 
grep -B 1 `git hash-object filename` 

これは/ハッシュ、作者、およびタイムスタンプwのコミットあなたを見つけるでしょう。これをさらに簡単に自動化する方法を考えようと思います。

+0

thx、これは有望ですね! – Alexy

関連する問題