.idea / scala_compiler.xml
和 .idea / scala_settings.xml
(实际上应该忽略整个 .idea
目录)。基本上,我希望Git将文件设置为不再被跟踪,但不会删除任何人的文件。 .idea / scala_compiler.xml
和 .idea / scala_settings.xml
(实际上应该忽略整个 .idea
目录)。基本上,我希望Git将文件设置为不再被跟踪,但不会删除任何人的文件。git rm --cached
命令运行的恰当时间运行此命令。当然,这不是您想要使用的解决方法。.idea/*
,Git将把它们放入新的提交中,而当您推送这些提交时,您无法推送文件,只能推送提交,并且带有这些文件的提交将被传播。当您获取新的提交时——同样,您获取整个提交而不是文件——这些提交将带有这些文件。.idea/*
的 commit。 当前提交中具有这些文件。.idea/*
的文件。You (they) must tell your (their) Git to forget these files now, so that the work-tree copies of these files are untracked:
git rm -r --cached .idea # note the --cached
Now you (they) tell your Git: switch to the new commit. The untracked files aren't in Git's view at all, and aren't in the new commit either, so Git won't remove the work-tree copies of these files.
git rm -r --cached .idea && git commit
当你使用git checkout
或git switch
切换一个提交记录到另一个时,比如改变所在的分支,你就是要告诉Git:删除关于当前提交记录的所有内容,并切换到另一个提交记录。 这样Git会清空它的索引,移除你工作目录中每个对应文件的副本——也就是Git知道的那些文件。然后重新填充索引,并从你想要工作/使用的提交记录中复制相应的文件到你的工作目录:这就是你的新的当前提交记录。
如果Git知道.idea/*
,那么这就是为什么.idea/*
文件会被移除。如果它们不在新的提交记录中,那么它们就不会从新的提交记录中恢复出来。
.gitignore
对不注意细节的人有陷阱.gitignore
文件的名字有些误导性。在.gitignore
中列出的文件并不一定是未跟踪的,如果它们已经被跟踪——因为它们在Git的索引中——那么它们根本没有被忽略。
在这里需要注意的是未跟踪文件是指当前存在于你的工作目录中,但不在Git索引中的文件。这意味着如果.idea/*
已经被跟踪了——例如从当前提交记录中出现——但你刚刚运行了git rm --cached .idea/*
或git rm -r --cached .idea
,那么这些工作目录中的副本就变成了未跟踪状态。它们是否在当前提交记录中并不重要:重要的是它们现在是否在Git的索引中。
.gitignore
告诉Git三件事情。前两个通常很重要,第三个则是陷阱。
如果未跟踪的文件名或模式出现在.gitignore
中,则git status
命令不会抱怨文件未被跟踪。
如果未跟踪的文件名或模式出现在.gitignore
中,则git add
命令不会将该文件添加到Git索引中(如果需要,可以强制覆盖此行为)。 这意味着该文件将在日常的git add
操作中保持未跟踪状态。
如果未跟踪的文件名或模式列在.gitignore
中,则Git有时会随意重写该文件。
您可能熟悉这个问题:您开始处理某个文件(即工作树中的副本),然后意识到:“哎呀,我想在另一个分支上完成这项工作。” 您运行git checkout branch
或git switch branch
,Git以其有些神秘的方式说道:我不能那样做。 Git告诉您有未保存的更改将被覆盖。
(有时Git仍会让您切换分支。这都涉及到Git的索引。有关详细信息,请参见在当前分支上有未提交的更改时切换到另一个分支)
如果此未保存的工作在已跟踪的文件中,或者在未列在.gitignore
中的未跟踪文件中,则此安全检查将防止您丢失数据。 但是,在.gitignore
中列出文件有时会允许Git覆盖或删除工作树副本。不明显的是准确发生这种情况的时间 - 即使采取此措施,Git有时也会告诉您先保存文件 - 但这是问题。
不幸的是,这个问题的唯一真正的解决方法与问题本身一样痛苦或更加痛苦:您可以使用具有包含永远没有该文件的提交的存储库来构建新的、不兼容的编辑历史记录存储库。
要完成这个任务,可以使用git filter-branch
、git filter-repo
(比较新的工具,尚未和 Git 一起发布),或者 The BFG 等 Git 提交历史编辑工具。所有这些工具的工作方式都是必须要 复制 老的提交——那些包含文件的提交——到新的提交中,并使用不同的哈希 ID,在这些新的提交中,这些文件将永远不会出现。这个改变会 "自上而下" 扩散到所有随后的提交中。这就是新版本库与旧版本库不兼容的原因。1这些历史提交是早于不需要的文件的存在时间的。例如,如果你使用 GitHub 的技巧从一个 README.md
和 LICENSE
文件开始,那么该提交就不需要重写,并且将保持不变,并建立旧版本库和新版本库之间的公共提交历史记录。
此外,如果你使用旧版 Git,该版本早于 --allow-unrelated-histories
标志,或提供 --allow-unrelated-histories
到 git merge
中,那也可能会将旧的历史记录融合回新的历史记录中。
git pull
,以免将原始提交记录合并回重写的历史记录中:他们应该丢弃现有的克隆版本并创建新的克隆版本。(在这种情况下,清除旧提交记录的任何方法都可以。) - torek