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

标签 git github gitlab

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

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

最佳答案

这并不是完全不可能,但它违背了 Git 的设计方式,这使得它变得很困难。

这里的根本问题是 Git 关注的是提交而不是文件。提交确实包含文件 - 事实上,每个提交都有每个文件1的完整快照 - 当您使用 Git 作为传输机制时,它会传输整个提交。但提交也是跟踪的单位;每个提交通常都有一个指向一个提交的链接;点击这些链接即可了解历史记录。换句话说,提交历史记录,提交中包含文件意味着该文件将被跟踪。2

最终,使文件不被跟踪但仍被传输(“上传”)的两个目标是相互冲突的。要传输,文件必须处于提交状态。如果文件在提交中,则在提交 check out 时将跟踪该文件。

要使所有这些工作正常进行,您需要提交文件并传输提交,然后要么忘记提交,而将文件保留在某处(git reset 可以做到这一点),要么实时提交存在并因此跟踪文件。当您想要更新文件时,您可以进行新的提交,该提交具有丢弃旧提交的副作用(例如,使用 git commit --amend ),然后发送新的提交。但由于提交是一个完整快照,并且提交历史,因此丢弃旧的提交意味着丢弃一段历史。仅当提交中仅有内容是 PDF 和 UML 图时才可以。

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

这两种方法中的任何一种(使用棘手的提交和git重置的方法,或者使用 PDF 和 UML 文件保留单个根提交的混合方法)都需要很多花哨的东西服务器端的支持。据我所知,这不能通过 GitHub 获得。如果您控制服务器,则始终可以编写自己的代码来做到这一点。


1更准确地说,提交具有提交中每个文件的快照。但这样说会导致明显的同义反复:提交包含该提交包含的内容

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

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

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

关于git - 上传文件而不跟踪 Git 中的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48551336/

相关文章:

GIT - 如何测试 fork 的更改/pull 请求?

github - 如何使用 GitHub API 获取提交总数

Gitlab 运行程序无法启动。这项工作被卡住了,因为您没有任何在线事件的运行者,并为他们分配了任何这些标签 : ios

gitlab - 从 Gitlab 中的其他项目运行脚本

git - "fatal: Authentication failed"与 git-credential-manager

git - 如何在git中存储未 merge 的代码?

git 树(仍然)包含重复项和错误信号 13

git - 如何处理分支 "test"

git - 将 "authoritative"git 仓库从 Github 转移到私有(private) github

docker - "npm run build"在 Dockerfile : dist folder is generated but disappears