1、Git 如何管理项目的配置文件
在项目中时常会有一些配置文件,这些配置文件必须存在于项目当中但各个成员之间并不需要保持一致。而且因为大家的运行环境不同等原因,大家都需要对其进行修改,但不应该将这些配置文件提交上去,因为这会影响到别人。
比如一个项目中的 .classPath 文件,每个人的项目中都必须要有这么一个文件才能运行,而每个人的 classpath 文件内容都不需要保持一致,如果成员将自己本地的 .classPath 文件提交上去将会对别人造成不便。此时我们应该如何管理这些配置文件呢?
如果直接在 .gitignore 文件中设置忽略这些文件,那么一开始就不能将这些配置文件提交至远程仓库,因为 .gitignore 不能忽略已经被追踪(track)过的文件,这样的话每个人克隆项目后都需要新建配置文件。如果不设置忽略,那么每个人都可能会将自己本地的配置文件修改提交上去,这可能会导致冲突,并且其他人根本就不需要获知你的配置文件修改,而你将修改提交上去将会对别人有害而无益。
解决方法有下面两种:
1.1、各自设置忽略配置文件的修改
这种方法是远程仓库中配置文件已经存在,每个人克隆项目时本地都会有配置文件并且都会对其进行修改。此时如果我们直接在 .gitigore 文件中设置忽略该配置文件的话是没有效果的。因为 .gitignore 只能忽略那些原来没有被追踪(track)过的文件,如果该文件之前已经被纳入了版本管理中,则修改 .gitignore 对其不生效。Git 之前已经添加到了版本库中的文件,即使后面再在 .gitignore 文件中添加忽略该文件,在本地中对该文件进行修改仍会看到修改状态,并且会提交上去。
这时我们可以通过 git 命令来设置忽略该文件的提交,也就是忽略该文件在本地的修改。
可以使用以下命令来忽略该文件的本地修改。
git update-index --skip-worktree PATH //在PATH处输入文件目录
使用这个命令,时间久了,可能会忘记自己忽略过哪些文件,这时候可以使用` git ls-files -v . | grep "^S" `命令找出来忽略过的文件。
git ls-files -v . | grep "^S" //使用这个命令找出之前设置过忽略的文件
不想继续忽略该文件时,使用` git update-index --no-skip-worktree `命令,来让git不再忽略该文件。
git update-index --no-skip-worktree PATH //设置不再忽略
在上图中,我将 mockJson.js 文件设置了忽略本地修改,此时可以查看到该文件在忽略列表里,并且在设置之后查看状态就不会看到该文件的修改状态。该文件的本地修改仍会保存,但是并不会提交到版本中。
或者使用下面的命令也可以设置忽略
git update-index --assume-unchanged PATH 在PATH处输入要忽略的文件。
可参考:https://blog.csdn.net/xingchenxuanfeng/article/details/97629740、https://www.cnblogs.com/wtil/p/11676092.html
缺点:使用这种方法管理项目的配置文件会需要所有人都主动设置忽略配置文件的提交,并且如果有某个人没有设置忽略,并且将他在本地的修改提交了上去,在你拉取代码时就会提示:Your local changes to the following files would be overwritten by merge: xxx.xxx。
这时候你可能就需要先取消对该配置文件的忽略,然后暂存、提交,再拉取、解决冲突,在解决完后你仍然不应该将配置文件推送,所以你应该再次设置忽略,比较繁琐。
1.2、建立模拟的通用配置文件(常用方法)
Git 对于配置文件的管理,通常都会把一个通用的模拟配置文件(比如后面加个 .dist 或者 .bak 之类的后缀,这些文件对项目本身并不会有影响)作为备份放在远程仓库中,每个人都会将这个模拟的配置文件克隆下来,并且可以基于这个模拟的配置文件来生成一个真实的配置文件。在 .gitignore 文件中我们需要设置忽略真实的配置文件,这样每个人都可以在本地对这个真实的配置文件进行修改,但并不会提交,所以对其他人不会造成影响,这也是 git 对于项目的配置文件比较通用的管理方式。
实例:
假设 local.js 是项目运行所需要的一个配置文件,每个人都可以对其进行修改并且无需保持一致。此时我们可以建立一个 local.default.js 文件放在远程仓库中,然后在 .gitignore 文件中设置忽略 local.js 文件。local.default.js 文件的内容是 local.js 中各自比较通用的内容,每个人都可以基于这些内容来编辑各自的 local.js 文件。每个开发者在拉取项目后都需要在本地手动建立 local.js 文件来保证项目的正常运行,不过因为 .gitignore 文件已经设置了忽略,所以不会将这个文件提交上去,也就不会对别人造成影响。