Git:切换分支时保留被忽略的文件

8
我知道这似乎是GIT:如何在切换分支时保留被忽略的文件?的重复,但我在那里找不到答案。 因此,我使用--orphan标志创建了一个新分支,以删除提交历史记录。 然后,我对所有文件执行git rm --cached,修改了.gitignore以忽略其中一些文件,然后添加并提交。 如预期的那样,被忽略的文件不在新存储库中(也不在任何历史记录中)。 但是,当我切换分支时它们就消失了(即,当我检出旧分支,然后再次检出新分支时)。 我该怎么避免这种情况发生? 编辑:整个操作的目的是为了准备将项目发布到GitHub上,因此我想隐藏某些包含私人信息(例如密码、密钥等)的配置文件。 这就是为什么我通过创建一个新的孤立分支来删除提交历史记录。 我明白,可能在将它们添加到.gitignore之前提交文件可以解决消失的问题,但这将使文件最终在公共历史中可见。 我尝试执行git add -f,然后执行git rm --cached,但这并没有起作用。

这些被忽略的文件的性质是什么?它们是本地配置文件还是其他类型的文件?这些文件在其他分支中是否有版本控制? - Tim Biegeleisen
@TimBiegeleisen 我在问题中添加了更多细节。是的,这些文件在其他分支中有版本控制,我只是将它们放在了新分支的gitignore文件中,该分支旨在公开发布。 - splinter123
1个回答

7
然而,当我切换分支时它们就会消失(也就是说,当我检出旧分支,然后再次检出新分支)。我该如何避免这种情况?
你不能。这是设计如此。在你的publish分支中,你没有跟踪这些文件,并且为它们设置了.gitignore。很好!但是当你切换到其他已跟踪这些文件的分支时,它们将被检出到你的工作目录中。这是因为.gitignore仅适用于未跟踪的文件。
根据文档
一个.gitignore文件指定Git应忽略的有意义的未跟踪文件。Git已经跟踪的文件不会受影响。
现在,如果你试图切回你的publish分支,这些文件将从磁盘中删除,因为它们在该分支中不存在。针对这些文件的.gitignore被忽略了,因为它们已经被跟踪,不适用于它们。
(请注意,它们 - 根据定义 - 即使在您要切换的分支中,也会被跟踪。这主要是实现细节,我承认这可能不直观。)
您需要做的是删除所有分支中这些文件的每个出现。使用像BFG Repo Cleaner这样的工具从您的历史记录中完全删除这些文件,在所有分支中。然后,您可以安全地将其添加到.gitignore中,一旦它们完全消失,您就可以安全地将其推送到GitHub。

这里的“因为它们被追踪”并不能说明问题——在新的分支中,它们是不被追踪的。正是从在旧检出中存在到在新检出中不存在的转变导致了Git更新工作树。 - jthill
在执行结账命令时,它们会被添加到索引中,因此它们会被跟踪。 - Edward Thomson
你看吧?这是正确的,对于理解“tracked”是什么意思的人来说,你的回答非常合理...但是,理解这一点的人不会问OP的问题。 - jthill
那是一个合理的批评。 :) - Edward Thomson
@jthill 我知道 "tracked" 的意思,就像任何使用过 git 的人一样。在这里发问并不意味着你完全不识字。 - splinter123
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接