防止新忽略的文件在 git 结帐时更改
Prevent newly ignored files from changing on git checkout
我遇到以下情况:我的 git 存储库损坏了之前签入的 .project 文件,我们想删除它们,因为它们会导致各种导入问题。所以我创建了一个分支,在那里我删除了所有的 .project 文件,将“.project”添加到 .gitignore,并计划将其合并到 master 中,让所有开发人员下载最新的更新,然后重新导入.我已经对此进行了测试,它工作正常...新的元数据(即 .project)文件由 Eclipse 创建,但由于 .gitignore 更改而被忽略。
问题是,如果开发人员切换到他们在修复前创建的问题分支之一,该分支仍将具有旧的(不正确的).project 文件,这些文件在检出时将覆盖 eclipse 刚刚生成的内容在他们的工作目录中。这打破了一切...
我尝试了 "update-index --skip-worktree" 和“--assume-unchanged”,但它不能正常工作,我想是因为这些文件不再在索引中并且被忽略了。除了在告诉他们重新导入所有内容之前将 master 合并回他们的所有分支之外,有什么办法可以解决这个问题吗?
谢谢。
编辑:我应该指出,虽然我对 git 非常有经验,但我团队中的开发人员完全是新手。因此,理想情况下,任何解决方案都是我可以在回购端执行的解决方案,他们只需单击 "pull" 即可让一切自动运行。如果有一条命令可以通过 SourceTree 控制台 运行,那也可能有效...
很可能,如果您可以与存储库的所有用户协商,那么最适合您的方法是重写整个存储库,完全删除文件。使用 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 数据库上运行,而无需检查每次提交在存储库中。但是 --index-filter
的脚本更加复杂和繁琐。
然后,在重写存储库并且您检查每个分支中的每个提交都收到了所需的更改之后,所有开发人员都应该重新获取存储库。最好让他们在您开始之前将所有本地更改推送到存储库,以最大程度地减少在他们收到修改后的存储库时进行变基的工作。
我遇到以下情况:我的 git 存储库损坏了之前签入的 .project 文件,我们想删除它们,因为它们会导致各种导入问题。所以我创建了一个分支,在那里我删除了所有的 .project 文件,将“.project”添加到 .gitignore,并计划将其合并到 master 中,让所有开发人员下载最新的更新,然后重新导入.我已经对此进行了测试,它工作正常...新的元数据(即 .project)文件由 Eclipse 创建,但由于 .gitignore 更改而被忽略。
问题是,如果开发人员切换到他们在修复前创建的问题分支之一,该分支仍将具有旧的(不正确的).project 文件,这些文件在检出时将覆盖 eclipse 刚刚生成的内容在他们的工作目录中。这打破了一切...
我尝试了 "update-index --skip-worktree" 和“--assume-unchanged”,但它不能正常工作,我想是因为这些文件不再在索引中并且被忽略了。除了在告诉他们重新导入所有内容之前将 master 合并回他们的所有分支之外,有什么办法可以解决这个问题吗?
谢谢。
编辑:我应该指出,虽然我对 git 非常有经验,但我团队中的开发人员完全是新手。因此,理想情况下,任何解决方案都是我可以在回购端执行的解决方案,他们只需单击 "pull" 即可让一切自动运行。如果有一条命令可以通过 SourceTree 控制台 运行,那也可能有效...
很可能,如果您可以与存储库的所有用户协商,那么最适合您的方法是重写整个存储库,完全删除文件。使用 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 数据库上运行,而无需检查每次提交在存储库中。但是 --index-filter
的脚本更加复杂和繁琐。
然后,在重写存储库并且您检查每个分支中的每个提交都收到了所需的更改之后,所有开发人员都应该重新获取存储库。最好让他们在您开始之前将所有本地更改推送到存储库,以最大程度地减少在他们收到修改后的存储库时进行变基的工作。