我正在研究一个项目,并且正在使用git和GitHub作为我的存储库(实际上是一本书,但是问题也与代码有关)。通常,就像在软件项目中一样,我只保留源,并且每次从该源构建输出(书籍PDF)时,我都会保留源。但是,由于我正在与某人合作,因此不会生成输出,因此只需查看当前进度,我需要定期检查生成的PDF,但是它很大。
我实际上不需要PDF的历史记录(输出),我只需要git中的最新版本。有什么办法吗?换句话说,我不想跟踪历史,只是让任何分支的尖端都有实际文件即可。
在研究此问题时,我认为唯一的方法是定期从git中清除文件的历史记录,然后检入新的PDF。有没有更简单的方法?
答案 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 --orphan
和git read-tree --empty -u
的地方步骤,之后您可以保留添加的工作树作为进行下一次更新的位置。但是总的来说,这是个坏主意。)
您可以使用标签代替分支名称;效果是一样的。但是,标签名称不会移动,因此此方法比较棘手。
这里的一般想法以及这个想法不好的原因是,历史是是。提交存储库中的历史记录。要拥有没有其他历史记录的文件,该文件必须完全在一次提交中。
另一种方法是将pdf作为单独的blob对象git add
,然后将 tag (轻量或带注释)附加到blob对象。删除标签以释放对象(它将最终被删除)。这具有与以前相同的缺点,加上标签不希望移动的问题,以及要提取文件的事实,您需要有点Git大师。