如何从git merge中排除特定的提交(永远)

时间:2014-03-14 12:24:01

标签: php git codeigniter github

我正在开发一些Web应用程序(php,codeigniter)。今天是把它推到github的时候了,但是我遇到了一个我无法管理的问题。

我有两个分支:

  • master - 此分支应该用于github推送,不包含凭据或任何其他敏感数据(只是公共代码)
  • dev - 这是主人的孩子,用于开发,确实包含凭证(我的私人应用程序实例)

凭据我的意思是:数据库登录,密码,主机,用户; oauth服务id / secrets; encryption_key。凭据存储在/ application / config文件夹中的2个单独文件中。

我的想法是,我将在dev上进行所有更改,而不是将dev合并到master中,并将master内容拉到github(但master不能包含我的私有凭据)。

这就是我到目前为止所做的事情:

  1. 从/application/config/config.php和/applications/config/database.php中移除了所有凭据(因为我不希望它们在github上公开)它们变成了一个空字符串,如: $ db ['default'] ['hostname'] ='';
  2. 启动git存储库并进行初始提交 - 创建的默认分支名为“master”
  3. 将主人拉到github
  4. 直到现在它还很酷 - 我的github上的项目代码没有凭据。接下来我需要在我的项目中进行一些更改,所以我:

    1. 创建新分支'dev'
    2. 将我的凭据存储到dev中,并进行提交 - 我需要dev instantion才能拥有凭据,因为每次我更改代码中的内容时我都会将其上传到ftp服务器(我不使用本地LAMP或类似的东西)在这个项目中)
    3. 所以现在我需要在dev中进行一些更改,上传它并拉到github,所以我:

      1. 对dev进行更改(假设添加新功能)
      2. 结账以掌握
      3. 将dev合并为master。
      4. 我期望发生的事情: Git会问我在'master'中应该使用哪个版本的配置,因为它在两个分支中都是不同的。我将使用diff来选择文件的“主”版本(不包含凭证)。 Git会记住我的选择,将来我不会再选择当我将dev合并到master中时。 Git在我的其他项目中的工作方式如下,其中dev是一个主分支,instantions是它的子项(在这种情况下,dev是一个孩子,我将子项合并为父项)。

        发生了什么: Git只是将凭证从dev复制到master,没有问我这个问题。所以现在我的主分支被凭证“污染”,我不能再把它推到github了。

        我的问题是:

        1. 为什么会发生这种情况,我该如何避免这种情况?
        2. 是否有其他(更好?)方式来处理这类问题。
        3. 如果有任何不清楚的地方,请告诉我,我们将不胜感激。

3 个答案:

答案 0 :(得分:0)

如果主分支中的文件在原始分支后更改为dev,则Git只会标记冲突,然后在dev中更改相同的文件。

我建议您为凭据添加一个.gitignore条目,或者使用ENVIRONMENT变量将它们分开,在codeigniter中这非常简单,您只需要在您的apache配置(vhost,如果您使用它们)上添加{ {1}}然后你可以在名为SetEnv APPLICATION_ENV development的{​​{1}}内添加一个文件夹,现在当你在开发环境中运行时,这些配置将优先于基本配置目录中的配置。

这不是关于gitignoring文件,删除提交,而是良好的文件结构和环境设置以区分不同的环境,使用application/configsdevelopment,和development(默认值)

否则添加.gitignore行告诉git忽略那些特定文件。

答案 1 :(得分:0)

Git ingore会有所帮助。 阅读此博客文章了解解决方案。

http://blog.pagebakers.nl/2009/01/29/git-ignoring-changes-in-tracked-files/

答案 2 :(得分:0)

您可以包含配置文件中的凭据,并将该文件添加到.gitignore

配置文件可以包含开发,预生产和生产环境的设置。