git - 为什么 git rm --cached my_dir/* 删除本地文件?

标签 git

我想 gitignore 一个已经提交到上游并分布在所有分支中的文件夹。我只需要从 git 版本控制中删除这些文件,而不是为我的文件系统删除,也不要从任何 forks 本地文件系统中删除。有什么办法吗?

我尝试了以下步骤:

  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/ 丢失了。我尝试了很多次,但同样的事情正在发生。任何人都可以解释为什么会这样。我做错了什么吗?我希望我忽略的文件不会从我的本地文件系统中删除。有什么办法可以实现吗?请帮忙。

最佳答案

一旦您 checkout 一个提交,其中的文件存在于该提交中,Git 必须删除被忽略的文件并放入已提交的文件 而不是。

只要内容匹配,Git 就可以足够安全地做到这一点。但现在这些文件在 Git 的索引中,因为提取任何历史提交——就像提取任何分支提示提交一样——会将这些文件所有复制到 Git 的索引和你的工作树中(这些是单独的副本) .

如果您现在远离从跟踪这些文件的历史提交切换到不存在这些文件的最近提交,Git 必须删除它们像往常一样,从 Git 的索引和您的工作树作为提交切换的一部分。

所以这很正常,但也非常烦人。您现在必须取回这些文件的内容,同时忽略它们。由于内容可能与您切换到的提交匹配,因此您可以使用该提交的(未忽略的)内容。要将路径为 path/to/file 的文件放入您的工作树中,请使用:

git restore --source <commit-hash-or-branch-name> --worktree path/to/file

例如,如果您有 git restore。如果您的 Git 早于 Git 2.23,因此您没有 git restore,请考虑使用:

git show <commit-hash-or-branch-name>:path/to/file > path/to/file

如果您提交了一个您不应该提交的文件,那么包含该文件的提交对于粗心的人来说是一种陷阱。最好不要在过去提交这些文件。这可能需要获得一台时间机器:回到过去,阻止自己添加和提交这些文件,现在您有未提交的文件。 I'm not quite sure what the right verb conjugation is here though.

关于git - 为什么 git rm --cached my_dir/* 删除本地文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66884402/

相关文章:

git - 在 Azure DevOps 的 Git pull 请求模板中添加字段

git - 如何确定 git 存储库的父存储库?

git - 如何使用 git-archive 导出特定的提交?

git - 通过 VSTS API 将一个分支 merge 到另一个分支

git show HEAD^ 似乎不起作用。这是正常的吗?

windows - 在 git 中创建符号链接(symbolic link)时权限被拒绝

angular - 当我使用 rebase 或其他标志时,会调用 ng 而不是 git

git - 让 Git 在 Visual Studio 中忽略 WebDeploy 的 PublishProfile

git - 将目录中的所有文件跟踪到 git LFS,但忽略该目录中存在的单个文件夹

带有中央存储库的 Git