【问题标题】:Fix license in old Git commits修复旧 Git 提交中的许可证
【发布时间】:2017-05-09 07:29:43
【问题描述】:

我目前有一个私有的 GitHub 存储库,它已经存在了几年。在README.md 文件中有一个许可证,不再准确。

现在我想把这个私人回购变成一个公共回购,使用固定的许可证。无论如何,所有旧的提交仍然包含旧的(错误的)许可证。

我该如何解决这个问题?我的第一个想法是squash the repository to a single commit and destroy everything else,但也许有更好的方法来实现我想要的。

从另一个问题可以看出,保留历史并不重要,但 OTOH 也没有什么坏处。

真正痛苦的是旧的提交使用错误的许可证。

有什么想法吗?

PS:我想确保没有人能够获得旧的提交,即使他们知道提交的 ID。所以,解决这个问题也要注意更新远程仓库,比如GitHub。

【问题讨论】:

  • 您可以使用git filter-branch 来执行此操作,但历史记录不应该反映从那个时间点更改了许可证吗?还是您要为整个项目追溯更改它?
  • 我正在为整个项目主动更改它,并且我不希望它可以通过旧许可证公开使用(即使这仅适用于源的旧状态)。在我公开之前,我想要所有东西的新许可证。
  • @NoufalIbrahim git filter-branch 是否允许您编辑历史记录中的文件?我认为这只是删除文件。我认为听起来你最好的选择是压缩提交并重新开始。
  • 哦,是的。给我一秒钟。 :)

标签: git github git-rewrite-history


【解决方案1】:

您可以使用filter-branch 来执行此操作。首先编写一个小脚本,为给定的提交重写树。例如,仅当 README.md 文件存在时,以下内容才会将 something 更改为 something else

if [ -f README.md ]; then
    sed 's/something/something else/g' README.md > tmp
    mv tmp README.md
fi    

将此保存为change.sh,然后运行以下命令

git filter-branch --tree-filter "/bin/bash $(pwd)/change.sh" HEAD

这将重写从 HEAD 返回的所有提交。如果您犯了一个错误,您可以使用git reset 回到之前的树并重试。

【讨论】:

    猜你喜欢
    • 2012-09-22
    • 2012-02-08
    • 2016-06-23
    • 2018-12-30
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    相关资源
    最近更新 更多