【问题标题】:Git: keep ignored files when switching branchesGit:切换分支时保留忽略的文件
【发布时间】:2016-05-13 10:28:25
【问题描述】:

我知道它似乎与 GIT: How to keep ignored files when switching branches? 重复,但我无法在那里找到答案。

所以我创建了一个带有--orphan 标志的新分支,以删除提交历史记录。然后我对所有文件执行了git rm --cached,修改了.gitignore 以忽略其中的一些,然后添加并提交。正如预期的那样,被忽略的文件不在新的 repo 中(也不在它的任何历史记录中)。但是,当我切换分支时它们会消失(即,当我检出旧分支,然后再次检出新分支时)。我怎样才能避免这种情况?

编辑:整个操作的目的是准备一个要在 GitHub 上发布的项目,所以我想隐藏一些包含密码、密钥等私人信息的配置文件。这就是为什么我通过创建删除提交历史记录一个新的孤儿分支。我知道在将文件添加到.gitignore 之前提交文件可能会解决消失的问题,但这会使文件最终在公共历史中可见。我试着做git add -f,然后git rm --cached,但它没有成功。

【问题讨论】:

  • 这些被忽略的文件的性质是什么?它们是本地配置文件还是其他东西?这些文件是否在其他分支中进行了版本控制?
  • @TimBiegeleisen 我在问题中添加了更多细节。是的,这些文件是在其他分支中进行版本控制的,我只是将它们放在打算公开的新分支的 gitignore 文件中。

标签: git


【解决方案1】:

但是,当我切换分支时它们会消失(也就是说,当我检出旧分支,然后再次检出新分支时)。我怎样才能避免这种情况?

你不能。这是设计使然。在您的 publish 分支中,您没有跟踪文件,并且您有一个 .gitignore 用于它们。伟大的!但是,当您切换到确实跟踪这些文件的其他分支时,它们将被检出到您的工作目录。这是因为.gitignore 仅适用于未跟踪的文件。

来自the documentation

gitignore 文件指定了 Git 应该忽略的故意未跟踪的文件。 Git 已跟踪的文件不受影响。

现在,如果您尝试切换回 publish 分支,这些文件将在磁盘上删除,因为它们不存在于该分支中。您对这些文件的.gitignore 将被忽略,因为它们已被跟踪并且不适用于它们。

(请注意,根据定义,它们会被跟踪即使它们位于您要切换的分支中。这主要只是一个实现细节,我承认这可能不会直观。)

您想要做的是删除这些文件在所有分支中的每一次出现。使用BFG Repo Cleaner 之类的工具完全从所有分支中的历史记录中删除这些文件。然后,您可以安全地.gitignore 他们,然后,一旦他们完全消失,您就可以安全地将其推送到 GitHub。

【讨论】:

  • 是我,对于这个答案中的错误来说,反对票太苛刻了。
  • @jthill 这是什么错误?
  • “因为他们被追踪”并不能解释任何事情——在新分支中,他们没有被追踪。是从存在于旧结帐到不存在于新结帐的过渡导致 git 更新工作树。
  • 它们在调用 checkout 命令时位于索引中。因此,它们会被跟踪。
  • 看到了吗?这是正确的,你的回答对于理解“跟踪”意味着什么的人来说非常有意义......但是,理解这一点的人不会问 OP 的问题。
猜你喜欢
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 2013-12-09
  • 1970-01-01
相关资源
最近更新 更多