一个朋友问我一种方法,可以在未来的某个时间点上取消跟踪文件--但是能够让git checkup恢复到文件仍然被git跟踪的状态。目的是将文件保存在本地,但防止未来的提交我过去在谷歌上搜索过这个问题--并阅读了几个stackoverflow对类似问题的回答。但似乎没有什么好办法来实现这一点。文件的跟踪状态似乎是全局控制的。有没有办法保持跟踪状态在本地控制(意思是可以在提交之间改变)?
vnjpjtjt1#
文件的跟踪状态似乎是全局控制的不,不是这样的。是否有一种方法可以保持跟踪状态在本地控制(意味着可以在不同的提交之间更改)?不,因为那不是跟踪。你说的都不是跟踪。一个文件之所以被跟踪,是因为它存在于索引中。基本上就是这样。它存在于索引中的原因有两种:(1)它存在于当前 checkout 的提交中(也叫HEAD);(2)你已经创建了该文件并将其添加到了索引中(用git add)。这个定义是完全自动和自主的。那么,如何使一个被跟踪的文件不被跟踪呢?从一个相当明显和粗糙的层面上讲,由于“tracked”的整个定义依赖于索引,您可以简单地从索引中删除该文件(使用git rm)。还有一种排除机制:你可以使用一个.gitignore文件。但是这对我已经说过的内容没有任何影响。它仅仅列出了一个大范围操作的例外,即如果一个特定类型的新文件应该出现,当你给予一个全局命令(如git add .)时,它不应该被 * 添加到索引中 *,当你说git status时,它不应该被 * 列出 * 在新的未跟踪文件中。
git add
git rm
.gitignore
git add .
git status
pw9qyyiw2#
但似乎没有什么好办法来实现这一点。这是正确的,这是一个基本的问题。这里的问题是,一个没有被跟踪的文件(在任何给定的时间点)是一个确实存在于 * 工作树 * 中,但并不存在于 * Git的索引中的文件--在这里,唯一真正 * 存在于 * Git中的部分是Git的索引。如果你 checkout 某个旧的提交,而文件 is 在提交中,Git必须:
这意味着如果在你的工作树中有一个未被跟踪的文件在这个名字下,它必须被销毁,这样提交的版本才能被提取出来。如果它被成功地提取出来,它现在在你的工作树中(不在Git中)和Git的索引中,并且是一个被跟踪的文件。根据定义,之前未被跟踪的文件会被销毁,除非有一些不在Git中的(例如,操作系统级)重新获取名义上已删除并替换的文件的方法。1因此,Git通常会 * 反对 * 销毁某个未被跟踪的文件。一个git checkout或git switch会销毁这样的文件,但会因错误而停止,告诉您需要先以某种方式保存文件,除非您使用--force选项。不幸的是,在.gitignore中列出文件--你可能希望这样做来防止它 * 意外地 * 被跟踪--给了Git * 销毁文件的权限 *。Git开发者社区希望有一种方法可以将某些文件路径标记为“不跟踪通常的.gitignore风格”和“珍贵的,不销毁”。2截至目前(Git 2. 39左右),仍然没有办法做到这一点。1许多现代的文件系统提供了一种方法来实现这一点,文件系统称之为“快照”。你选择某个时间点,并说“制作文件系统快照”,然后你可以将文件系统回滚到那个时间点。这与版本控制系统实现的想法是一样的,只是它是在每个文件系统的基础上完成的。FS快照方法背后的细节变得复杂。例如,MacOS“时间机器”与UFS或ZFS快照有很大的不同。尽管想法本身相当简单:所有快照前的文件版本都被保存一段时间(“所有时间”或“直到快照过期”或其他),通过使用“提取以前的快照”软件--不管是什么--你 * 可以 * 取回文件。
git checkout
git switch
--force
qxgroojn3#
停止跟踪文件git rm file_name要防止文件被跟踪,请将文件名添加到.gitignore
git rm file_name
3条答案
按热度按时间vnjpjtjt1#
文件的跟踪状态似乎是全局控制的
不,不是这样的。
是否有一种方法可以保持跟踪状态在本地控制(意味着可以在不同的提交之间更改)?
不,因为那不是跟踪。你说的都不是跟踪。
一个文件之所以被跟踪,是因为它存在于索引中。基本上就是这样。它存在于索引中的原因有两种:(1)它存在于当前 checkout 的提交中(也叫HEAD);(2)你已经创建了该文件并将其添加到了索引中(用
git add
)。这个定义是完全自动和自主的。那么,如何使一个被跟踪的文件不被跟踪呢?从一个相当明显和粗糙的层面上讲,由于“tracked”的整个定义依赖于索引,您可以简单地从索引中删除该文件(使用
git rm
)。还有一种排除机制:你可以使用一个
.gitignore
文件。但是这对我已经说过的内容没有任何影响。它仅仅列出了一个大范围操作的例外,即如果一个特定类型的新文件应该出现,当你给予一个全局命令(如git add .
)时,它不应该被 * 添加到索引中 *,当你说git status
时,它不应该被 * 列出 * 在新的未跟踪文件中。pw9qyyiw2#
但似乎没有什么好办法来实现这一点。
这是正确的,这是一个基本的问题。这里的问题是,一个没有被跟踪的文件(在任何给定的时间点)是一个确实存在于 * 工作树 * 中,但并不存在于 * Git的索引中的文件--在这里,唯一真正 * 存在于 * Git中的部分是Git的索引。
如果你 checkout 某个旧的提交,而文件 is 在提交中,Git必须:
这意味着如果在你的工作树中有一个未被跟踪的文件在这个名字下,它必须被销毁,这样提交的版本才能被提取出来。如果它被成功地提取出来,它现在在你的工作树中(不在Git中)和Git的索引中,并且是一个被跟踪的文件。
根据定义,之前未被跟踪的文件会被销毁,除非有一些不在Git中的(例如,操作系统级)重新获取名义上已删除并替换的文件的方法。1因此,Git通常会 * 反对 * 销毁某个未被跟踪的文件。一个
git checkout
或git switch
会销毁这样的文件,但会因错误而停止,告诉您需要先以某种方式保存文件,除非您使用--force
选项。不幸的是,在
.gitignore
中列出文件--你可能希望这样做来防止它 * 意外地 * 被跟踪--给了Git * 销毁文件的权限 *。Git开发者社区希望有一种方法可以将某些文件路径标记为“不跟踪通常的.gitignore
风格”和“珍贵的,不销毁”。2截至目前(Git 2. 39左右),仍然没有办法做到这一点。1许多现代的文件系统提供了一种方法来实现这一点,文件系统称之为“快照”。你选择某个时间点,并说“制作文件系统快照”,然后你可以将文件系统回滚到那个时间点。这与版本控制系统实现的想法是一样的,只是它是在每个文件系统的基础上完成的。
FS快照方法背后的细节变得复杂。例如,MacOS“时间机器”与UFS或ZFS快照有很大的不同。尽管想法本身相当简单:所有快照前的文件版本都被保存一段时间(“所有时间”或“直到快照过期”或其他),通过使用“提取以前的快照”软件--不管是什么--你 * 可以 * 取回文件。
qxgroojn3#
停止跟踪文件
git rm file_name
要防止文件被跟踪,请将文件名添加到.gitignore