【问题标题】:Git commit and push a binary file, but don't keep historyGit 提交并推送二进制文件,但不保留历史记录
【发布时间】:2014-05-14 12:45:10
【问题描述】:

我有一个 .NET C# 存储库。包括一个二进制可执行文件,它基于同一存储库中的许多定期更新的 SQL 脚本构建数据库。当然,bin 文件夹会被 .gitignore 忽略。

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

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

如果没有,你们有没有任何非常简单的解决方案。该文件只是一个供 5 或 6 名员工使用的内部实用程序,因此任何类型的破解解决方案都可以。

【问题讨论】:

    标签: c# git release


    【解决方案1】:

    您可以为二进制文件创建一个blob并标记blob,当您替换二进制文件时,您实际上是创建一个新blob,prune旧的,删除标记,创建一个指向新blob的新标记.

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

    1. cat my_binary_file | git hash-object --stdin -w | xargs git tag -a tag_my_binary_file -m 'this is the message describing the binary file'
    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 和标签的步骤

    【讨论】:

      【解决方案2】:

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

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

      这将覆盖以前的提交,因此您在任何给定时间都只会有文件的单个修订。在客户端,您可以通过使用文件签出分支或使用git show branch:file > file

      来获取文件的内容

      【讨论】:

      • 有趣的概念。我想知道你是否可以用 git 子模块做类似的事情(--amend 和 --force 推送到子模块)
      猜你喜欢
      • 2015-04-17
      • 2015-04-20
      • 2021-06-12
      • 2021-12-26
      • 2015-10-19
      • 2011-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多