商業会社はオープンソースプロジェクトをフォークし、独自のコマンドラインオプションを追加しました。私の問題は、フォークがかなり前のものであり、新しい機能を利用するためにコードを更新したいということです。
彼らがGPLに準拠し、変更されたソースのアーカイブをリリースしたことを考えると、どのようにして彼らが分岐したgitバージョンを最もよく判断できますか?
商業会社はオープンソースプロジェクトをフォークし、独自のコマンドラインオプションを追加しました。私の問題は、フォークがかなり前のものであり、新しい機能を利用するためにコードを更新したいということです。
彼らがGPLに準拠し、変更されたソースのアーカイブをリリースしたことを考えると、どのようにして彼らが分岐したgitバージョンを最もよく判断できますか?
単に tarball に対してそれを見つける必要があるため、分岐点の最良の推測は、tarball との差分が最小限であるコミットを見つけることです。
リリース済みのタグ付きバージョンからフォークが開始されたと思われる場合は、これを使用できます。
eval "
git for-each-ref --shell --format 'echo -n %(objectname) " "; git diff %(objectname) --minimal | wc -l' refs/tags
" | sort -n -k 2 -r | tail
このコマンドは、最初の列にコミット名を出力し、2 番目の列に変更された行の番号を出力します (およそ、差分のヘッダーもカウントしますが、あまり変化しないはずなので)、変更された行の数でソートされます。あなたのフォークポイントはそこの最後の行でなければなりません。
これがどのように機能するか: すべてのタグと tarball 入力の間で git diff を実行し、統一された形式で、この diff のコンテキストとカウント行なしで実行します。次に、この変更された行数でソートされます。
会社が編集を開始する前 (分岐点) の最後のコミット ID を見てください。
次に、os リポジトリでそのコミット ID を見つけます。
次に、両方のリポジトリの最新のコミットを比較し、会社のリポジトリからの変更にパッチを適用して、新しいブランチの os リポジトリに適用することをお勧めします。いくつかの競合を修正し、テスト、テスト、テスト、そしてうまくいけばあなたの良いことです!
Assuming you have access to the Git repositories of the original open source project and the commercial fork, you can use git merge-base
:
git merge-base original_project/master commercial_fork/master
This will find the most recent common ancestor of both original_project/master
commercial_fork/master
. The output of this command is the Git revision the fork is currently derived from. You can use git describe
or git tag --contains
to try to identify the project version corresponding to that Git revision.