3

在我们的 .gitignore 文件中,database.php因为它是一个 db 配置文件,需要特定于每个开发人员的本地安装。但是,每次我签出分支时,我都必须重新创建该文件。糟透了。

如何添加文件以使其不会每次都消失,但也不会被跟踪?

4

2 回答 2

10

[编辑] 已识别的重复项包含此问题的更可靠的解决方案 ( git submodules)。这个答案是有效的,但经过进一步考虑,如果您希望团队在每个克隆中获得相同的行为,这是不合适的。 [结束编辑]

Git--assume-unchanged通过git update-index. 这将让您提交 database.php 的生产版本,并让开发人员更新此文件的本地版本以指向他们的本地资源。

git add database.php
git commit
git push
git update-index --assume-unchanged database.php

何时/如果您需要更改 database.php 的生产版本:

git update-index --no-assume-unchanged database.php
git commit -a
git update-index --assume-unchanged database.php

此外,如果需要,每个开发人员都需要运行git update-index --assume-unchanged database.php,因为此命令仅影响本地存储库。

您将希望通过其他一些失败的机制来确保database.php开发人员在非生产机器上失败 - 不希望开发人员明显指向生产:)

请注意,您需要先从忽略列表中删除 database.php 文件,然后才能添加它。

于 2013-04-26T05:33:31.550 回答
6

在版本控制下将文件添加到存储库然后要求 git 不要跟踪文件的任何更改是一个非常糟糕的主意。在版本控制下添加的文件旨在进行版本控制和跟踪,如果您不想跟踪对文件的任何更改,则经验法则是首先不要添加它。

同意人们有自己的偏好,并且 git 在某种程度上也支持这些工作流程,但是您很少看到有人使用它,而是更倾向于更清洁和直接的解决方案。实际上,OP 请求的用例(在版本控制下添加文件并使 git 停止跟踪对文件的任何更改,并使所有未来的克隆/获取/拉取成为可能)根本不直接git可行.

.gitignore用于排除文件意外受到版本控制,也用于 git 不在命令中列出任何更改,如git status. 但是如果一个文件已经存在于版本控制之下,git 并不关心该文件是否是其中的一部分,.gitignore并开始跟踪对它的更改。

相反,我建议您添加一个名为的模板文件database-template.php,并让每个用户创建它的副本database.php并将他/她的更改输入其中。您也可以编写一个简单的脚本来执行此操作。

除此之外,添加database.php到你的.gitignore,你就可以开始了,这样用户的本地副本就不会进入版本控制。

替代解决方案:还有另一种方法可以做到这一点,但每个开发人员都应该在他的本地仓库中进行,这确实是一个糟糕的方法 IMO:

# Ask git to stop tracking any changes to database.php
git update-index --assume-unchanged database.php

# If you want to start tracking changes again to database.php
git update-index --no-assume-unchanged database.php
于 2013-04-26T01:48:06.060 回答