git SourceTree中停止跟踪和忽略文件有什么区别

问题描述 投票:0回答:2

当我只将文件添加到忽略列表(“忽略”它)时,它仍然显示在未分段的部分进行更改时。如何正确忽略它以便不再被跟踪?

将文件添加到忽略列表和“停止跟踪”之间有什么区别呢?

困惑。

git atlassian-sourcetree
2个回答
0
投票

如果文件已经添加(例如,它是HEAD修订版的一部分,您正在处理的修订版),则会跟踪该文件。此时,该文件不能被忽略。您可以将它添加到.gitignore,git将继续告诉您该文件已被修改(如果是这种情况)。为了让你忽略它,它必须是untracked(如果它已被跟踪,正如我所说)。为了做到这一点,您可以将其从修订版中删除,同时使用git rm --cached the-file将其保留在工作树中。如果文件已经在.gitignore上,那么它将不再被报告....至少,向前移动。但是如果你想回到其中一个仍有文件的修订版会怎么样? Git会抱怨。如果你强行结账,如果你回去会发生什么?文件消失了!因此,如果你想要完全从历史中删除文件,有时最好重写历史...这一切都取决于你需要付出多少努力。


0
投票

“停止跟踪”会从索引中删除文件。该文件不会包含在下一次提交中。如果该文件已包含在先前的提交中,则git会将此解释为在从上一次提交进行到下一次提交时删除该文件的指令。如果该文件尚未包含在先前的提交中,那么它只是成为一个未跟踪的文件(好像该文件刚刚创建并且git尚未被告知它)。

“忽略文件”为文件的路径创建git ignore规则。忽视规则被广泛误解。忽略规则告诉git,“如果您看到一个未跟踪的文件,其路径/文件名与此模式匹配,您应该(默认情况下)忽略它”。两个关键点:

1)如果你说要忽略一个被跟踪的文件(比如前一次提交中的文件),这实际上什么都不做。 (如果你这样做并且没有删除文件,那会有所作为 - 但也许不是你想要的。我会回过头来看。)

2)虽然UI说您可以忽略该文件,但实际上忽略了适用于路径的规则。您告诉git忽略它可能在当前与该现有文件关联的路径/名称中找到的任何未跟踪文件。

我猜你可能想要做的是忽略对文件的更改,同时保留已经在历史记录中的当前版本。不仅上述选项都不这样做,而且事实上没有选择这样做。 (有许多经常提出的解决方法,但我不推荐任何一种,因为它们都有不良的副作用。)

值得注意的是,有些人尝试直接路由“忽略对跟踪文件不起作用,因此不要跟踪文件”。如上所述,如果您希望后续提交认为您已删除该文件,则这只是正确的解决方案。

它的长短是,如果您需要在提交中保持文件原样,但需要对文件进行本地更改(应该忽略),则这是一项无法得到很好支持的要求。 (这不仅仅是git无法做到这一点;没有工具可以做得很好,因为这是一个矛盾的要求。)所以你真的应该退一步看看如何修改你的过程而不需要这样做。

(人们提出的最常见的原因 - 可能是您的理由 - 也可能是您的理由 - 他们希望在源树中“就地”修改配置文件。如果您搜索该问题,您会发现一些SO帖子详细说明了避免这个问题的方法。)

© www.soinside.com 2019 - 2024. All rights reserved.