0

我目前正在发布几个开源项目。通常,完整的源代码以 ZIP 存档的形式提供或在开源存储库中签入。这使得ohloh的分析变得困难。

如果该软件是在非公共存储库中开发的,则可以使用完整的历史记录。但是,我不想发布完整的历史记录。

我想使用 git 来达到两种可能性之一:

(i) 每个作者一次提交:每个作者 应该有一个提交(提交日期为最终发布日期)。每个提交都包含代码行,最终成为最终版本。

(ii) 仅包含最后代码行的原始提交:在此变体中,保留了提交本身的数量。每次提交的修改方式都是只保留最终进入最终版本的行,而删除所有其他的行。

有没有人实现过其中一种变体?变体 (i) 似乎可以使用git-blame和一些脚本。

4

2 回答 2

2

(i) 每位作者一次提交

我想这在逻辑上是不可能的:假设你有一个这样的提交序列:

  • 提交:A,作者:Alpha
  • 提交:B,作者:Beta
  • 提交: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:要转换的存储库。也可能是 repo 的子目录。
  • outDir:应该在其中创建新仓库的目录。必须是空的。

可选参数:

  • --name NAMEuser.name用于提交文件 。默认为 git 的 global user.name
  • --email EMAILuser.email用于提交文件 。默认为 git 的 global user.email
  • --date DATE 用于提交的日期。默认为最后一次提交的日期。

请注意,git 在提交时区分作者和提交者。作者取自 using git blame,提交者数据取自全局user.nameanduser.email或给定配置的--nameand --email

DEBUG 模式目前只能在代码中启用。

限制

  • 仅适用于没有任何未跟踪文件的 git 存储库
  • 空行分配给“git-oss-releaser”,而不是添加这些空行的第一个或最后一个作者
  • 存储库必须包含至少一个非二进制文件
  • 提交日期仅来自非二进制文件
  • 在 git 下测试仅适用于 windows
于 2012-07-22T20:36:57.210 回答