Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在git中拥有当前文件而不是文件的历史记录?_Git_Github - Fatal编程技术网

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

如何在git中拥有当前文件而不是文件的历史记录?,git,github,Git,Github,我正在从事一个项目,并使用git和GitHub作为我的存储库(实际上这是一本书,但问题也与代码有关)。通常,在软件项目中,我只保留源代码,每次从该源代码生成输出(书籍PDF)。但是,由于我正在与某个不会构建输出的人合作,只要看看当前的进度,我就需要定期检查生成的PDF,但它很大 我实际上不需要PDF(输出)的历史记录,我只需要git的最新版本。有没有办法做到这一点?换句话说,我不想跟踪历史,只想让任何分支的尖端都有实际的文件 在研究这个问题时,我认为唯一的方法是定期从git中清除文件的历史记录,

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

我实际上不需要PDF(输出)的历史记录,我只需要git的最新版本。有没有办法做到这一点?换句话说,我不想跟踪历史,只想让任何分支的尖端都有实际的文件


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

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

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

其他主要的持续集成工具也可以完成这类工作,因此我鼓励您四处逛逛,找到最适合您需要的工具。

没有好的方法可以做到这一点。不要这样做。做

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

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

$ 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
步骤的位置,之后可以将添加的工作树作为一个地方下一次更新。但总的来说,这都是一个坏主意。)

您可以使用标记而不是分支名称;效果相同。但是,标记名称不应移动,因此此方法比较复杂

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


另一种方法是
git将pdf添加为一个单独的blob对象,然后在blob对象上附加一个标记(轻量级或带注释的)。移除标记以释放对象(它最终将被删除)。这和以前一样有缺点,再加上标签不能移动的问题,再加上要提取文件,你需要成为一位Git大师。

你现在处于核心命令领域。你不想要历史,只想要内容,所以使用它的内容跟踪核心。唯一的问题是,你想要多少Git你有什么事吗

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

$ make book.pdf
$ git tag -f current-book `git hash-object -w book.pdf`
完成了。如果任何源代码管理命令都不知道如何处理该标记,那么它甚至不是一棵树,只是一个blob,但是Git的核心命令可以正常工作

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

不,您不需要提交pdf。事实上,您不应该。如果您的合作者不想构建该文件,请通过git以外的其他渠道提供。最简单的渠道是github,如果它支持我所需的内容,并且由于github主要是git的主机服务,我希望这是可能的。我可以经常使用它“发布”它,但那太麻烦了。我会找到另一种方法。@PeteP,“GitHub”不一定是“Git”的意思。你可以在GitHub中使用它。这将导致创建一个Git标记,标识与发布相关联的源版本,并且你可以手动上传文件(如PDF)以配合发布(参见步骤7).IMO这是最接近我的答案,我很乐意相应地更新它。我喜欢这个答案。它告诉OP如何做他们要求的事情,并使用标准工具来做。但如果它提到为什么在回购协议中这样做可能不可取,并触及“标签预计不会移动”,我更喜欢它torek说的那一点我得到了“别这么做”从答案的复杂性来看,我可以看出git并不是专门用来做这件事的。如果我按照jthill的建议去做,我会看到master branch上的book.pdf吗?不,我想,这会使整个练习毫无意义,因为合作者不是git专家——她需要成为一个获得文件的人。所以我想我会找到另一个她的方式。
$ git fetch origin current-book
$ git show FETCH_HEAD >book.pdf
$ open book.pdf