如何停止跟踪文件而不从仓库中删除它

43

我有一个配置文件,我想将其保存在远程存储库中,但不想在我的计算机上跟踪其更改。将其添加到.gitignore文件中并不能解决问题。

我不想跟踪更改的原因是它应该根据计算机的环境而异。


4个回答

92

如果您想暂时停止跟踪一个文件,您仍然可以使用

git update-index --assume-unchanged <file>
// track changes again :
git update-index --no-assume-unchanged <file>

3
值得注意的是,git reset --hard 命令也会影响这些文件,因此,如果选择使用该方法来管理本地配置文件,则需要记住在执行 git reset --hard 命令时,这些文件也会被重置,并且任何本地更改都将丢失。 - Yoel
我刚刚发现,当你将<file>设置为git update-index --assume-unchanged <file>时,你不能切换分支。在切换分支之前,你必须执行git update-index --no-assume-unchanged <file> - Sanjay Rawat
请注意,--assume-unchanged 可能不会按照您的预期工作,在某些情况下,Git 仍然可能将文件标记为已修改并将其包含在更改中。有关更多信息,请参见 https://dev59.com/7mAg5IYBdhLWcg3w1uDy。 - stackPusher

11

如果是这种情况,那么你根本不应该将文件进行版本化,而是应该对文件进行模板化。例如,如果配置文件是 foo/config.txt,则应该在代码库中放置一个带有示例(或空白)配置设置的版本化的 foo/config.txt.template。不应将 foo/config.txt 放入代码库中,而应使用 .gitignore 忽略它。

然后,在新的克隆中,你只需将 foo/config.txt.template 复制到 foo/config.txt 并根据需要更改设置即可。


但是我认为仓库的版本应该对应于你们的生产代码。 - Ben G
2
@babonk:配置应该有版本控制,但它们不一定要与代码一起进行版本控制。它们可以在生产系统上进行版本控制。如果与您的代码一起,则可以将其放置在 foo/production-config/config.txt 上,而开发环境则在 foo/dev-config/config.txt 上使用模板(如 cdhowie 建议的那样)。 - Ryan Stewart

3
您需要结合.gitignore文件和git rm --cached来完成操作。 请使用以下命令: git rm --cached filename.txt 这将从索引中删除该文件,但它仍然存在于您的存储库和工作区中。应用rm --cached后,您需要提交更改才能生效。它会在您跟踪的更改中显示为已删除,但这只是因为它已从索引中删除。 注意:如果您在未来的提交中再次更改它,您将不得不运行:git rm --cached来取消跟踪对该文件的更改。

这正是我在寻找的!谢谢! - dmikam
很高兴能帮到你! - Dhaval Chheda

-1

你可以提交所有其它文件,然后针对本地配置的更改,可以使用git提供的'stash'功能。


这不是用于暂存的。 - gented

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接