为什么使用 "git rm --cached my_dir/*" 命令会删除本地文件?

3
我希望gitignore一个已经提交到上游并分布在所有分支中的文件夹。 我只需要将这些文件从git版本控制中删除,而不是从我的文件系统中删除,并且不会从任何派生本地文件系统中删除它们。 有什么办法吗?
我尝试了以下步骤:
1. 将文件夹路径添加到我的.gitignore文件中,例如my_ignore_folder/*。 2. 然后运行命令git rm -r --cached my_ignore_folder/*。 3. 然后运行git add --all。 4. 然后运行git commit -am "ignored folder"。 5. 最后运行git push origin my_branch name。
在执行所有这些操作之后,我运行了ls my_ignore_folder/,发现所有文件都像预期的一样存在于我的文件系统中。然后,我通过git checkout another_branch切换到一个不忽略这些文件的不同分支。因此,ls my_ignore_folder/显示所有文件。然后,当我再次切换回之前忽略了这些文件的分支并运行ls my_ignore_folder/时,我惊奇地发现my_ignore_folder/不见了。我尝试了多次,但情况仍然如此。请问为什么会发生这种情况?我做错了什么吗?我希望忽略的文件不要从我的本地文件系统中删除。有没有办法可以实现这一点?请帮帮我。
1个回答

2
一旦你检出一个包含这些文件的提交,Git必须将被忽略的文件删除,并放入提交的文件。只要内容匹配,Git可以安全地执行此操作。但现在这些文件已经在Git的索引中,因为提取任何历史提交(就像提取任何分支末尾提交一样)都会将所有这些文件复制到Git的索引和工作树中(这些是单独的副本)。如果您现在切换到不包含这些文件的最近提交,Git必须将它们从Git的索引和您的工作树中删除,作为提交切换的一部分,与往常一样。所以这是完全正常的,但也非常令人恼火。您现在必须获取这些文件的内容,同时保持它们被忽略。由于内容可能与您切换到的提交匹配,因此可以使用该提交的(未被忽略的)内容来获取路径为path/to/file的文件到您的工作树中,请使用:
git restore --source <commit-hash-or-branch-name> --worktree path/to/file

例如,如果你使用git restore命令。如果你的Git版本早于2.23,因此没有git restore命令,请考虑使用:
git show <commit-hash-or-branch-name>:path/to/file > path/to/file

如果您提交了不应该提交的文件,包含该文件的提交记录对于不谨慎的人来说是一种陷阱。最好不要在过去提交这些文件。这可能需要获得一个时间机器:回到过去,阻止自己添加和提交这些文件,现在您就有了未提交的文件。我不太确定这里的正确动词时态。


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