GIT忽略和GIT挂钩 - 在提交推送后替换文件

时间:2017-04-01 19:14:38

标签: php git githooks

我的GIT存储库位于/var/repo/myRepo.git。我设置了一个GIT钩子post-receive*来将文件从我的存储库复制到我项目的文件夹

git --work-tree=/var/www/laravel --git-dir=/var/repo/myRepo.git checkout -f

每次我在服务器上提交并推送某些内容时,文件var/www/laravel/config/services.php都会被替换,我在服务器上所做的修改将替换为我的本地副本。

例如,如果我手动修改以下文件,如服务器上的 (通过ssh会话)

无功/网络/ laravel /配置/ services.php

This is the modified content of this file

在提交和推送之后会是这样的

无功/网络/ laravel /配置/ services.php

This is the default content of this file

我尝试将/config/services.php添加到.gitignore,但似乎无效。

的.gitignore

/node_modules
/public/storage
/public/hot
/storage/*.key
/vendor
/.idea
Homestead.json
Homestead.yaml
.env
/config/services.php

我应该怎么做才能在每次在服务器上提交内容时不替换此文件?

2 个答案:

答案 0 :(得分:0)

  

我应该怎么做才能在每次在服务器上提交内容时不替换此文件?

您只有两个选择:

  1. 不要检查,或
  2. 不要查看。
  3. 你的git checkout -f命令意味着"给我最新的提交,覆盖一切。"如果最新提交具有新版本的文件,则会覆盖该文件的旧版本。

    (此外,.gitignore文件并不代表您认为的含义。它不是忽略的文件列表。它是一个文件列表 - 或名称模式 - 不要抱怨。通常最重要的是,它允许你向Git声明:"是的,我知道这些是在我的工作树中,而不是在我的索引中;不要#39;告诉我。"它在输入端 - 即,"不要检查它"部分。)

    这导致了关于可配置软件的一般规则,其中软件本身是在Git中维护的,或者实际上是任何版本控制系统:不要将配置放入版本控制系统。 配置不是软件的一部分。

    例如,考虑一下Git本身。您必须配置 Git,告诉您user.nameuser.email,以便使用您的用户名和电子邮件地址进行提交。现在假设Git带有其软件内置的配置文件,表示您的用户名是Fred,您的电子邮件是fred@fred.fred每当您将Git更新为新版本时,它都会将您的名称更改回" Fred< fred@fred.fred>"。这不是很友好,是吗?

    Git将您的配置存储在Git软件的之外。可以肯定的是,默认配置条目,但设置的任何内容都保存在其他地方。更新Git不会触及这个。这不是特定于Git,甚至是版本控制系统:提供升级的任何系统不得将其配置存储在升级销毁的文件中。

    所以,停止这样做。

答案 1 :(得分:0)

我做了git rm /config/services.php并手动重新导入了该文件。现在该文件不会被GIT取代。