如何在不更改 master 中的配置文件的情况下合并 Git?
How can I merge in Git without changing config files in master?
我们有许多包含信息的配置文件,例如 url,需要针对我们的开发环境进行修改。我们在 git 中创建开发环境作为分支,并对配置文件进行更改。问题是当我们将development分支合并回master分支时,它改变了master分支中的配置文件。
我们想将文件存储在git中,所以我不相信我们可以使用.git忽略。由于我们使用的是 elastic beanstalk,因此我们需要将所有源代码保存在 repo 中,并且每次都需要部署整个源代码。
我们已经尝试使用.git属性,并阅读了很多帖子,例如How do I tell git to always select my local version for conflicted merges on a specific file?,但您在.git中设置的合并驱动程序似乎仅当两个文件都发生更改时才会调用属性。在我们的例子中,我们不会更改 master 分支中的配置文件,因此永远不会调用合并驱动程序。
有没有不用写脚本就能做到的简单方法?
解决方法很简单:不提交配置文件。
创建模板配置文件并提交。安装您的应用程序时,复制模板并更改您需要更改的内容。将真实的配置文件保存在 .gitignore 中以避免意外提交。
高级用途是创建两个配置文件:应用程序默认值和本地覆盖。提交默认值,不提交本地覆盖。这种方法的好处是您只覆盖您需要的内容而未指定其他值,因此当默认值更改时,您不必更新本地覆盖配置。缺点是您必须在应用程序初始化期间加载和合并两个配置文件。
在研究了一些 git 命令(例如 rebase 和 fetch)之后,我找到了一种简单的方法来执行此操作。只需将分支创建为孤立分支,将配置文件复制到它,然后使用命令 "git checkout configs_branch -- . " 实质上将配置文件复制到父分支。
那么详细:
使用回购 url
初始化 git 回购
git远程添加源(远程仓库url)
确保您位于要从中创建分支的分支
创建将包含配置文件的分支作为孤立分支,以便该分支不包含所有源代码
git checkout --orphan configs_branch
将配置文件复制到 repo 的这个分支添加文件,提交并推送
Git 添加 .
Git commit -m "initial commit with config files"
git 推送原点 configs_url
合并成功后
来自父分支
git 结帐父分支名称
git 获取 --all
将配置分支的文件复制到父分支
git 结帐 configs_branch -- 。
(执行完上面的命令你还是在父分支上)
提交文件
git commit -m "resetting the config files"
感谢@vampire 的帮助!
您无需编写脚本即可寻求解决方案。我的解决方案包括脚本。但是,它们已经写好了。
1) 创建一个自定义合并驱动程序,它将忽略相应文件的合并冲突。必须为 .gitattributes
中的每个文件注册驱动程序
2) 在该文件中的每次提交时创建合并冲突(否则,合并是微不足道的并且不会使用合并驱动程序)。这可以通过 .git/hooks/post-commit 中的 post-commit 挂钩来完成,该挂钩在每次提交后更改每个分支中的该文件。
我在一些脚本中结合了它:https://github.com/keepitfree/faithfulgit
我们有许多包含信息的配置文件,例如 url,需要针对我们的开发环境进行修改。我们在 git 中创建开发环境作为分支,并对配置文件进行更改。问题是当我们将development分支合并回master分支时,它改变了master分支中的配置文件。
我们想将文件存储在git中,所以我不相信我们可以使用.git忽略。由于我们使用的是 elastic beanstalk,因此我们需要将所有源代码保存在 repo 中,并且每次都需要部署整个源代码。
我们已经尝试使用.git属性,并阅读了很多帖子,例如How do I tell git to always select my local version for conflicted merges on a specific file?,但您在.git中设置的合并驱动程序似乎仅当两个文件都发生更改时才会调用属性。在我们的例子中,我们不会更改 master 分支中的配置文件,因此永远不会调用合并驱动程序。
有没有不用写脚本就能做到的简单方法?
解决方法很简单:不提交配置文件。
创建模板配置文件并提交。安装您的应用程序时,复制模板并更改您需要更改的内容。将真实的配置文件保存在 .gitignore 中以避免意外提交。
高级用途是创建两个配置文件:应用程序默认值和本地覆盖。提交默认值,不提交本地覆盖。这种方法的好处是您只覆盖您需要的内容而未指定其他值,因此当默认值更改时,您不必更新本地覆盖配置。缺点是您必须在应用程序初始化期间加载和合并两个配置文件。
在研究了一些 git 命令(例如 rebase 和 fetch)之后,我找到了一种简单的方法来执行此操作。只需将分支创建为孤立分支,将配置文件复制到它,然后使用命令 "git checkout configs_branch -- . " 实质上将配置文件复制到父分支。
那么详细:
使用回购 url
初始化 git 回购git远程添加源(远程仓库url)
确保您位于要从中创建分支的分支
创建将包含配置文件的分支作为孤立分支,以便该分支不包含所有源代码
git checkout --orphan configs_branch
将配置文件复制到 repo 的这个分支添加文件,提交并推送
Git 添加 .
Git commit -m "initial commit with config files"
git 推送原点 configs_url
合并成功后
来自父分支
git 结帐父分支名称
git 获取 --all
将配置分支的文件复制到父分支
git 结帐 configs_branch -- 。
(执行完上面的命令你还是在父分支上)
提交文件
git commit -m "resetting the config files"
感谢@vampire 的帮助!
您无需编写脚本即可寻求解决方案。我的解决方案包括脚本。但是,它们已经写好了。
1) 创建一个自定义合并驱动程序,它将忽略相应文件的合并冲突。必须为 .gitattributes
中的每个文件注册驱动程序2) 在该文件中的每次提交时创建合并冲突(否则,合并是微不足道的并且不会使用合并驱动程序)。这可以通过 .git/hooks/post-commit 中的 post-commit 挂钩来完成,该挂钩在每次提交后更改每个分支中的该文件。
我在一些脚本中结合了它:https://github.com/keepitfree/faithfulgit