使用Git的smudge/clean功能替换文件内容。

7
我希望使用git来管理我的网站上线部署。我遇到的问题是,我有几个设置文件,当我推送到生产环境时不想更新它们。
我考虑的解决方案是使用钩子(hook)或用smudge/clean修改文件内容,例如将其从
<?php
define('DB_NAME', 'live');
define('DB_HOST', '127.0.0.1');
define('DB_USER', 'live_user');
define('DB_PASS', 'livePass');

为了

<?php
define('DB_NAME', 'local');
define('DB_HOST', '127.0.0.1');
define('DB_USER', 'local_user');
define('DB_PASS', 'localPass');

请问有人能够为我讲解这个过程吗?

我曾经考虑使用post-receive hook和shell脚本来替换内容,但是理想情况下,我希望在运行git checkout -f之前就已经更改了仓库中的内容,而不是在实时副本中更改。

2个回答

7
理想情况下,我希望在运行 git checkout -f 之前更改存储库中的内容,而不是在实时副本中更改。最接近的方法是使用筛选器内容驱动程序,它将替换 git checkout 中的值。

smudge

(来自Scott SchaconPro Git书关于Git属性的页面: 章节“关键字扩展”)

所以在你的情况下:在.gitattributes文件中声明一个模糊过滤器。

参见 "Git能否自动在空格和制表符之间切换?",除了你会使用sed将本地替换为实时 (如这个例子)


感谢您的快速回复,那么为了澄清,我需要使用特定的脚本类型吗?还是它可以运行我的服务器上的任何脚本? 如果是这样,它如何与存储库中的文件交互?我不理解它们之间的关系,因此不知道如何更新文件。 - Matt Indeedhat Holmes
@MattSmokey-watersHolmes,你可以在你的模糊声明中声明一个脚本或直接使用命令。在你的例子中,一个简单的 sed 就足够了。 - VonC
1
@Nicholas 版权归属已添加。 - VonC
你真快!我取消了踩的评价 :-) 在署名的情况下盗用图片对我来说没问题。 - Nicholas Shanks

0

我认为,为了全面了解情况,尤其是要仔细检查“关键字扩展”的部分,您必须从头到尾阅读Git书中的Customizing Git-Git属性主题。在那里,自定义手工脚本用于将存储库中的KEYWORD转换为工作目录(以及反向)中的FINAL TEXT。它们是任何代码,可以在带有工作目录的主机上执行,并从.gitattributes文件中引用。

注意:因为您必须拥有不同的clean-filter输出(针对本地和实时环境),所以在常见文件名下,您可能在本地和实时WorkingDir下拥有两个略微不同(内容上的)clean脚本。(在书籍示例中,所有位置的清洁结果相等-使用单个脚本)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接