【问题标题】:Prevent newly ignored files from changing on git checkout防止新忽略的文件在 git checkout 上发生更改
【发布时间】:2016-03-29 22:40:13
【问题描述】:

我有以下情况:我的 git 存储库损坏了之前签入的 .project 文件,我们想删除它们,因为它们会导致各种导入问题。所以我创建了一个分支,在其中删除了所有 .project 文件,将“.project”添加到 .gitignore,并计划将其合并到 master 中,让所有开发人员拉下最新更新,然后重新导入。我已经对此进行了测试,它工作正常...新的元数据(即 .project)文件由 Eclipse 创建,但由于 .gitignore 更改而被忽略。

问题是,如果开发人员切换到他们的问题分支之一,该分支是在修复前创建的,该分支仍将具有旧的(不正确的).project 文件,在签出时将覆盖 eclipse 刚刚在他们的工作目录。这打破了一切......

我尝试了“update-index --skip-worktree”和“--assume-unchanged”,但它不能正常工作,我认为是因为这些文件不再在索引中并且被忽略了。除了在告诉他们重新导入所有内容之前将 master 合并回他们的所有分支之外,有什么办法可以解决这个问题吗?

谢谢。

编辑:我应该注意,虽然我对 git 非常有经验,但我团队中的开发人员完全是新手。所以理想情况下,任何解决方案都是我可以在回购方面做的,他们可以点击“拉”,让一切自动运行。如果有一个命令可以通过 SourceTree 控制台运行,那可能也可以...

【问题讨论】:

  • 也许您希望从存储库中彻底清除文件?

标签: eclipse git gitignore ignore


【解决方案1】:

很可能,如果您可以与存储库的所有用户协商,那么最适合您的方法是重写整个存储库,完全擦除文件。使用git filter-branch,类似这样:

git filter-branch --tree-filter 'rm -f .project && \
    if ! test -f .gitignore || ! grep -q "^\.project$" .gitignore; \
    then \
        echo .project >>.gitignore; \
    fi' -- --all

如果您的存储库足够大,那么您可能希望使用--index-filter 而不是--tree-filter,因为--index-filter 直接在 git DB 上运行,无需检查存储库中的每个提交。但是--index-filter 的脚本更加复杂和繁琐。

然后,在重新编写存储库并且您检查了每个分支中的每个提交都收到了所需的更改之后,所有开发人员都应该重新获取存储库。最好先让他们将所有本地更改推送到存储库,然后再开始最大程度地减少他们收到修改后的存储库时的变基工作。

【讨论】:

  • 我们有多年的历史和大量的分支机构......所以我可能不得不弄清楚索引过滤器选项。我假设在进行这些更改以更新源之后需要强制推送?
  • 是的,强制推送是绝对需要的。关于--tree-filter--index-filter:这取决于。我会在 Linux 中执行这样的操作(通常 git 在其文件系统上运行得更快),并会在 tmpfs 或至少在 SSD 驱动器上创建 repo 的副本,也许,也许,你不需要更复杂的解决方案。
  • --index-filter 的另一种可能的简化可能会发生,如果在您的所有 现有 提交中拥有相同的 .gitignore 文件是负担得起的(在未来的提交中,您可以更改它们)。在这种情况下,索引操作会简单得多,因为您可以提前预先计算所有需要的哈希值。
  • 感谢您的建议。我很担心,即使我告诉他们不是这样,人们也不会重新获取所有内容,然后一旦他们搞砸了回购,我就必须修复所有内容。所以我对我们所有的故事分支进行了自动合并。在 git 日志中造成了一个丑陋的小时,但我认为它更安全。我会接受你的回答,因为它确实回答了我原来的问题。谢谢!
猜你喜欢
  • 2020-08-20
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
  • 2014-05-19
  • 1970-01-01
  • 2023-01-23
  • 2010-09-08
  • 2018-04-02
相关资源
最近更新 更多