0

現在、いくつかのプロジェクトをオープン ソースとしてリリースしています。通常、完全なソースは ZIP アーカイブとして提供されるか、オープン ソース リポジトリにチェックインされます。これにより、ohlohによる分析が困難になります。

ソフトウェアが非公開リポジトリで開発された場合、完全な履歴が利用可能です。ただし、完全な履歴を公開したくありません。

2つの可能性のいずれかに到達するためにgitを使用したい:

(i) 作成者ごとに 1 つのコミット: 作成者ごと に 1 つのコミットが必要です (コミット日は最終リリース日です)。各コミットにはコード行が含まれており、最終的に最終バージョンになりました。

(ii) 最後のコード行のみを含む元のコミット:このバリアントでは、コミットの数自体が保持されます。各コミットは、最終的に最終バージョンになった行のみが保持され、他のすべての行が削除されるように変更されます。

バリアントの 1 つをまだ実装した人はいますか? バリアント (i) は、git-blameといくつかのスクリプトを使用して実行できるようです。

4

2 に答える 2

2

(i) 作者ごとに 1 つのコミット

論理的には不可能だと思います: 次のような一連のコミットがあるとします:

  • コミット: A、作者: アルファ
  • コミット: B、作者: ベータ
  • コミット: C、作者: Alpha

コミット C が B で行われた何かに依存している場合、A と C を並べ替えたり、押しつぶしたりすることはできなくなります。

(ii) 最後のコード行のみを含む元のコミット

そのためには、「git filter-branch --tree-filter」を使用できます。次のスクリプトは子猫を食べる可能性があることに注意してください。単純なテスト リポジトリでしかテストしていないためです。あなたは警告されました:

git filter-branch --prune-empty --tree-filter '
    # directory which contains the final version of the project
    FINAL_VERSION="$DIRECTORY_WITH_REPOSITORY_OF_FINAL_VERSION"

    # directory which contains the filtered version of the repository
    FILTER_DIR="$(pwd)"

    # apply the current commit in to the final version in reverse mode,
    # ignore the rejects
    cd "$FINAL_VERSION"
    git show "$GIT_COMMIT" > /tmp/original.patch
    cat /tmp/original.patch | patch -p1 -t
    git diff > /tmp/filtered.patch

    # reset the FINAL_VERSION to the original state.
    git reset --hard
    git clean -f -d -x

    # apply the patch which contains the lines which could be reversed on
    # the filtered version
    cd "$FILTER_DIR"
    # revert the last commit
    patch -p1 -t < /tmp/original.patch

    # apply the filtered patch
    patch -p1 -t < /tmp/filtered.patch
    # remove the rejects by the modified patch 
    find -name "*.orig" -o -name "*.rej" | xargs rm -rf
' previousRelease..HEAD    

(これは、分岐点に「previousRelease」というタグを付けていることを前提としています。FINAL_VERSION 変数も調整する必要があります。)

于 2012-07-15T12:56:54.093 に答える
2

git-oss-releaserは、オプション (i) のソリューションです。

git-oss-releaser は、特定の git リポジトリを、最後のコミットのファイルのみを含む git リポジトリに変換し、git blame各ファイルの出力に似たものをコミットします。元の履歴は失われます。

利用方法:git-oss-releaser.py [-h] repoDir outDir

位置引数:

  • repoDir: 変換するリポジトリ。リポジトリのサブディレクトリの場合もあります。
  • outDir: 新しいレポを作成するディレクトリ。空である必要があります。

オプションの引数:

  • --name NAMEファイル のコミットuser.nameに使用する 。デフォルトは git の globalです。user.name
  • --email EMAILファイル のコミットuser.emailに使用する 。デフォルトは git の globalです。user.email
  • --date DATE コミットに使用する日付。デフォルトは最後のコミットの日付です。

git は、コミット時に作成者とコミッターを区別することに注意してください。作成者は を使用して取得git blameされ、コミッター データはグローバルuser.nameおよびuser.emailまたは指定された構成済み--nameandから取得されます--email

現在、DEBUG モードはコードでのみ有効にできます。

制限事項

  • 追跡されていないファイルのみを使用せずに git リポジトリで動作します
  • 空行は「git-oss-releaser」に割り当てられ、これらの空行を追加した最初または最後の作成者ではありません
  • リポジトリには少なくとも 1 つの非バイナリ ファイルが含まれている必要があります
  • コミット日は非バイナリ ファイルのみから取得されます
  • Windowsのみのgit でテスト済み
于 2012-07-22T20:36:57.210 に答える