上传文件而不跟踪Git中的更改

时间:2018-01-31 21:00:27

标签: git github gitlab

对于我的存储库的文档,我想上传PDF和UML图表(我猜是图像文件),但我不希望Git跟踪更改。我只想上传一个文件,当有该文件的新版本时,我希望更换旧版本。所以基本上没有版本化的文件(我知道这不是Git的意义,但在这种情况下我只是不需要它。)

这可以通过Git或gitlab或github完成吗?

2 个答案:

答案 0 :(得分:1)

这并非完全不可能,但这与Git的设计方式背道而驰,这使得它变得困难。

这里的根本问题是Git完全是关于提交而不是文件。提交确实包含文件 - 实际上,每个提交都有每个文件 1 的完整快照 - 当您使用Git作为传输机制时,它会传输整个提交。但是提交也是跟踪的单位;每个提交通常都有一个提交的链接;并通过以下链接获取历史记录。换句话说,提交历史记录,并且在提交中有文件意味着将跟踪该文件。 2

然后,最终,文件未被跟踪但仍然被传输(“上传”)的两个目标相互冲突。要传输,文件必须在提交中。如果文件在提交中,则会在提交签出的那一刻跟踪文件。

要使所有这些工作,您需要提交文件并传输提交,然后忘记提交,同时将文件保留在某处(git reset可以执行此操作),或者与提交存在一起使用从而跟踪文件。当您想要更新文件时,您可以使用git commit --amend进行新的提交,其具有丢弃旧提交的副作用 - 然后发送新提交。但由于提交是完整快照,并且提交历史记录,因此丢弃旧提交意味着丢弃一段历史记录。如果提交中的事物是PDF和UML图表,那就没有问题。

还有一个混合过程:有一个正常增长的提交链(正常历史)缺少PDF和UML文件,并且在相同或其他存储库中有一个单独的单一无父提交,但是用于此目的在这个答案中,假设“相同的存储库” - 仅存储PDF和UML图。要更新单一提交文件,请丢弃旧的单一无父提交,从而创建新的单一无父提交。然后,您可以将您的Git发送给其他Git 正常历史记录当前单个提交。然后,您必须安排另一个Git到git checkout正常历史记录,并将PDF和UML文件解压缩到另一个Git存储库的工作树中,而不将它们放入索引中。

这些方法中的任何一个 - 具有棘手提交和 - git reset的方法,或者使用PDF和UML文件保持单个根提交的混合方法 - 需要在服务器上提供大量支持结束。据我所知,这不是通过GitHub提供的。如果您控制服务器,则始终可以编写自己的代码来执行此操作。

1 更准确地说,提交具有提交中每个文件的快照。但是这样做会使它成为一个显而易见的重言式:提交包含提交包含的内容

要查看任何特定提交中的内容,请运行:

git ls-tree -r <hash-or-other-specifier>

2 跟踪文件的精确定义是它是索引中的任何文件。这需要了解索引是什么;但是我们可以注意到,这里没有详细说明索引是从提交中填充的。这意味着如果提交1234567...存储文件README,那么提取提交的任何内容都会在索引中留下README,以便跟踪它。

答案 1 :(得分:0)

将其添加到.gitignore文件中。这是文档:https://git-scm.com/docs/gitignore