仅为某些分支忽略已提交的git文件

时间:2016-10-01 00:55:17

标签: git version-control

这与此question非常相似,但我有兴趣知道如何忽略某些分支的已提交git文件但不能忽略其他分支,或者找到我的问题的其他解决方案。

我们有一个配置文件,每个客户都有所不同。我们使用每个客户的分支在git中跟踪这个。同样,每个开发人员都有自己的自定义开发环境,需要一个唯一的配置文件。

我为我的环境创建了一个分支并尝试使用git update-index --assume-unchanged [path](来自此answer),但意识到虽然它忽略了我的分支中的更改,但它在更改分支时从不更新文件。这非常适合更换到另一个开发人员的分支,但是如果我要更改为客户的分支,我需要更改配置文件,因为我想将代码指向他们的数据库,例如

有没有办法忽略某些分支的配置文件而不是其他分支?

如果没有,我想到了几种替代方法,但每种方法都有其缺点:

  1. 在切换客户分支之前,请运行git update-index --no-assume-unchanged。这有效,但我知道我可能会忘记这一点,并且可能不会立即明显使用了错误的配置文件。
  2. 根本不要使用git update-index并在切换开发人员分支后将配置文件更改回我的设置。我偶尔也会忘记这样做。
  3. 感谢您提出任何其他想法。

2 个答案:

答案 0 :(得分:1)

也许你可以使用符号链接?例如,如果始终在存储库中的./etc/app.conf找到该文件,则可以将其作为未跟踪文件的符号链接:

$ ln -s dev.conf etc/app.conf
$ echo 'dev.conf' >etc/.gitignore
$ git add etc/app.conf etc/.gitignore
$ git commit -m "point `app.conf' to dev config"
$ ls -l etc/
total 3
lrwxrwxrwx 1 user users  8 Sep 30 23:31 app.conf -> dev.conf
-rw-r--r-- 1 user users 13 Sep 30 23:30 dev.conf

git跟踪符号链接,忽略dev.conf。当您切换到客户分支时,符号链接可以切换到实际的客户配置:

$ rm app.conf
$ echo '# customer config' >etc/app.conf
$ git add etc/app.conf
$ git commit -m 'add config for customer A'
$ ls -l etc/
total 3
-rw-r--r-- 1 user users 18 Sep 30 23:35 app.conf
-rw-r--r-- 1 user users 13 Sep 30 23:30 dev.conf

开发人员的自定义配置保持不变,但app.conf条目不再指向它。或者,您可以将app.conf留下符号链接并将其重新指向跟踪的客户配置:

$ echo '# customer config' >etc/customerA.conf
$ ln -sf customerA.conf app.conf
$ git add etc/app.conf
$ git commit -m "point `app.conf' to customer A config"
$ ls -l etc/
total 4
lrwxrwxrwx 1 user users 13 Sep 30 23:31 app.conf -> customerA.conf
-rw-r--r-- 1 user users 18 Sep 30 23:36 customerA.conf
-rw-r--r-- 1 user users 13 Sep 30 23:30 dev.conf

无论哪种方式,Git现在始终跟踪etc/app.conf是否在开发人员分支或客户分支上,以及您是否使用跟踪(即客户)配置是通过文件中的某个间接处理系统。这应该避免您遇到的忽略与跟踪的争用,并且一旦设置它基本上是自动的,因为符号链接是存储库的一部分。

答案 1 :(得分:0)

我建议另一种更为标准的解决方案我相信:

  • 在所有分支机构中将.conf文件重命名为.conf.default
  • .conf文件添加到所有分支中的.gitignore(或在master中执行并合并到所有分支中)
  • 更改将.conf.default复制到.conf
  • 的安装脚本(最初在生产计算机上运行)
  • 在每台开发计算机上定义一个post-checkout挂钩,将.conf.default复制到.conf,或让开发人员维护他的.conf文件(不推送挂钩,他们是按机器定义的)