如何在git中拥有当前文件而不是文件历史记录?

时间:2019-04-15 02:04:29

标签: git github

我正在研究一个项目,并且正在使用git和GitHub作为我的存储库(实际上是一本书,但是问题也与代码有关)。通常,就像在软件项目中一样,我只保留源,并且每次从该源构建输出(书籍PDF)时,我都会保留源。但是,由于我正在与某人合作,因此不会生成输出,因此只需查看当前进度,我需要定期检查生成的PDF,但是它很大。

我实际上不需要PDF的历史记录(输出),我只需要git中的最新版本。有什么办法吗?换句话说,我不想跟踪历史,只是让任何分支的尖端都有实际文件即可。

在研究此问题时,我认为唯一的方法是定期从git中清除文件的历史记录,然后检入新的PDF。有没有更简单的方法?

3 个答案:

答案 0 :(得分:4)

您在这里处于核心指挥区。您不需要历史记录,而只需要内容,因此请使用其内容跟踪器核心。唯一的问题是,您希望Git为您做多少?

最简单的过程是简单地标记blob:

$ make book.pdf
$ git tag -f current-book `git hash-object -w book.pdf`

您已完成。几乎没有任何源代码控制命令知道如何处理该标签,它甚至不是树,而是一个斑点,但是Git的核心命令可以正常工作。

$ git fetch origin current-book
$ git show FETCH_HEAD >book.pdf
$ open book.pdf

答案 1 :(得分:3)

我根本不会将其包含在存储库中。相反,我将其视为构建工件。您甚至可以在每次推送到GitHub时使用continuous integration工具生成它。

例如,使用Travis CI,您可以构建PDF并在标记新版本时将其uploaded as a GitHub release保留。您还可以配置CI作业以在将代码推送(或合并)到特定分支时运行。

其他主要的持续集成工具也可以执行这种操作,因此,我鼓励您货比三家,找到最适合您需求的工具。

答案 2 :(得分:3)

没有方法。不要这样做something else - see Chris' answer

如果您仍然坚持这样做

有几种 bad 方式可以做到这一点。可能最简单的方法是创建一个其中没有文件的孤立分支,将PDF作为该分支中的单个文件提交(这样,签出该分支就可以得到只有一个PDF文件的工作树,然后必须复制其他地方,然后git checkout您真正想要的分支,这将立即从您的工作树中删除 PDF文件):

$ git status

请确保您没有要提交的内容,并且您的工作树是干净的,因为您将要临时销毁它们。然后:

$ cp built.pdf /tmp/built.pdf          # save the PDF somewhere
$ git checkout --orphan pdfbranch      # create branch for one commit holding PDF
$ git read-tree --empty -u             # clear index and work-tree
$ cp /tmp/built.pdf built.pdf          # restore PDF to work-tree
$ git add built.pdf                    # copy to otherwise-empty index
$ git commit -m 'create built pdf'     # make one commit on branch
$ git checkout master                  # or whatever - PDF file goes away again

您现在可以在将来的任何时候删除分支pdfbranch(从该Git存储库的所有克隆),以免再保留旧的PDF文件,然后创建一个新的pdfbranch来再次保存一个生成的文件。

(如果您的Git至少为2.5,则可以使用git worktree add简化上述操作:使用git worktree add --detach ../pdf-worktree master创建一个执行git checkout --orphangit read-tree --empty -u的地方步骤,之后您可以保留添加的工作树作为进行下一次更新的位置。但是总的来说,这是个坏主意。)

您可以使用标签代替分支名称;效果是一样的。但是,标签名称不会移动,因此此方法比较棘手。

这里的一般想法以及这个想法不好的原因是,历史是。提交存储库中的历史记录。要拥有没有其他历史记录的文件,该文件必须完全在一次提交中。

另一种方法是将pdf作为单独的blob对象git add,然后将 tag (轻量或带注释)附加到blob对象。删除标签以释放对象(它将最终被删除)。这具有与以前相同的缺点,加上标签不希望移动的问题,以及要提取文件的事实,您需要有点Git大师。