Git提交并推送二进制文件,但不保留历史记录。

10

我有一个 .NET C# 仓库,其中包括一个二进制可执行文件,它基于一些定期更新的 SQL 脚本构建数据库,这些脚本也在同一仓库中。自然地,bin 文件夹被使用 .gitignore 忽略。

但是,我有一些非开发人员用户需要定期更新此文件。理想情况下,我想在他们的机器上放置一个简单的批处理脚本,执行 git pull 并收到新的二进制文件。但是,我真的不想跟踪该文件的历史记录并且使我的仓库充满不必要的数据。

是否可以提交一个文件而不保留该文件的历史记录?因此,每次提交文件时,它只是替换存储在仓库中的对象,而不是创建该对象的新版本。

如果不行,你们有没有任何非常简单的解决方案?该文件只是由 5 或 6 名工作人员使用的内部工具,因此任何类型的 hack 解决方法都可以。

2个回答

7

您可以在一个单独的孤立分支上维护该文件(git checkout --orphan NEWBRANCH),并在其中提交文件。

当您需要替换文件时,请使用--amend提交它,然后强制推送该分支。

这将覆盖以前的提交,因此您在任何给定时间只会有一个文件版本。在客户端,您可以通过检出具有文件的分支或使用git show branch:file > file来获取文件内容。


有趣的概念。我想知道你是否可以使用git子模块进行类似的操作(使用--amend和--force推送到子模块)。 - eddiewould

1
您可以为二进制文件创建一个 Blob 并标记它。当您替换二进制文件时,实际上是创建了一个新的 Blob,并删除旧 Blob 的标签,然后创建一个指向新 Blob 的新标签。

按照以下步骤创建 Blob 并标记它:

  1. cat my_binary_file | git hash-object --stdin -w | xargs git tag -a tag_my_binary_file -m '描述二进制文件的消息'
  2. git push --tags

现在,您已经为 my_binary_file 创建了一个 Blob,并创建了指向该 Blob 的注释标签 tag_my_binary_file,并将标签和 Blob 推送到上游。 您可以按照以下步骤从另一个客户端检出二进制文件:

  1. git fetch --tags
  2. git cat-file -p tag_my_binary_file | head -1 | cut -d" " -f2 | xargs git show > my_binary_file

现在,您将在当前目录中找到名为 my_binary_file 的二进制文件。

要替换文件,请按照以下步骤操作:

  1. git tag -d tag_my_binary_file
  2. git gc; git prune
  3. 重复创建 blob 和 tag 的步骤

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接