Git:如何添加文件但不跟踪它

Git:如何添加文件但不跟踪它,git,version-control,gitignore,Git,Version Control,Gitignore,在.gitignore文件中,我们有database.php,因为它是一个db配置文件,需要特定于每个开发人员的本地安装。但是,每次签出分支时,我都必须重新创建该文件。真糟糕 如何添加文件,使其不会每次消失,但也不会被跟踪?将文件添加到版本控制下的存储库中,然后要求git不要跟踪对文件的任何更改,这是一个非常糟糕的主意。在版本控制下添加的文件要进行版本控制和跟踪,如果您不想跟踪对文件的任何更改,经验法则是首先不要添加它 同意人们有自己的偏好,git在某种程度上也支持这些工作流,但您很少看到人们使

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


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

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

同意人们有自己的偏好,git在某种程度上也支持这些工作流,但您很少看到人们使用它,相反,您更喜欢更干净、更直接的解决方案。事实上,OP请求的用例(在版本控制下添加一个文件,并使git停止跟踪对文件的任何更改,并使将来的所有克隆/获取/拉取成为可能)在git中根本不直接可行

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

相反,我建议您添加一个名为
database template.php
的模板文件,让每个用户创建一个名为
database.php
的副本,并将其更改输入其中。您也可以编写一个简单的脚本来实现这一点

同时,将
database.php
添加到您的
.gitignore
中,您就可以开始了,这样用户的本地副本就不会进入版本控制

替代解决方案: 还有另一种方法可以做到这一点,但每个开发商都应该在其本地回购协议中做到这一点,在我看来,这确实是一种糟糕的方法:

# 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
[编辑] 识别出的副本包含了一个更健壮的解决方案(
git子模块
)。这个答案是正确的,但在进一步考虑之后,如果您希望团队在每个克隆中获得相同的行为,则不合适。 [结束编辑]

Git通过
——为
Git更新索引
设置未更改的
选项来支持这一点。这将允许您提交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——假设数据库.php未更改,因为这个命令只影响本地存储库

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


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

为什么这真的是个糟糕的主意?我也不明白为什么这么糟糕。我想这正是我的原因gitihnore@Emerson,使用
.gitignore
的确切原因是忽略自动生成的乱码,这些乱码可能很容易重新创建(如编译器生成的目标文件和二进制文件、日志、文本编辑器交换和备份文件等)。当您执行
git status
git add.
时,这样的文件会妨碍您的工作,这就是为什么
.gitignore
存在的原因。@Emerson
.gitignore
用于忽略不受版本控制的文件。一旦文件处于版本控制之下,git将跟踪其更改,即使它是
.gitignore
@mounds的一部分-为什么我提到这是一个坏主意,是不是用
git
无法无缝地做到这一点。您能用一组环境变量替换
数据库.php
?然后每个开发人员只需设置他们的环境,您就可以避开这个问题。@mu这正是我们试图避免的。我们有很多分支机构,每次都必须重新配置环境会影响生产力。请不要这样做!您希望向开发人员公开一个可选的、有文档记录的、特定于实例的、未预览的
database local.php
设置文件。下面是我尝试
git添加数据库时得到的结果。php
:fatal:pathspec'database.php'与任何文件都不匹配。我认为这是因为它目前在.git中。我需要先将其从gitignore中删除吗?是-已更新我的答案,谢谢@土堆-你错过了这个答案的一个关键部分
git push
不会也不能将您的更改推送到索引(对于
--假定未更改的
),因为它不是可以传播到远程的实际更改。该选项仅为本地repo中工作树的文件路径设置
假定未更改的
位。因此,每个开发人员都需要在其本地repo(每次新克隆后)中运行此命令,以确保对
database.php
的更改不会被跟踪。感谢@Tuxdude,很好,我已经编辑了我的答案以澄清这一点。