V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Rabbit52
V2EX  ›  程序员

问一个git的问题嘛~

  •  
  •   Rabbit52 ·
    HugoPresents · 2012-08-18 16:29:15 +08:00 · 4727 次点击
    这是一个创建于 4490 天前的主题,其中的信息可能已经有所发展或是发生改变。
    是这样得,我的项目要往服务器上部署嘛,但是服务器的配置文件是要修改的,然后修改之后下次使用 git pull 的时候提示我有未提交的修改不要我更新

    可不可以像SVN那样嘛,update顶多会产生冲突
    27 条回复    1970-01-01 08:00:00 +08:00
    marvinlix
        1
    marvinlix  
       2012-08-18 16:32:14 +08:00
    先git stash把本地为提交的缓存起来,git pull之后再去出来
    Rabbit52
        2
    Rabbit52  
    OP
       2012-08-18 16:36:03 +08:00
    @marvinlix 谢谢,我试下看看
    Rabbit52
        3
    Rabbit52  
    OP
       2012-08-18 16:42:38 +08:00
    @marvinlix 喔,这个果断行!谢谢
    9hills
        4
    9hills  
       2012-08-18 17:27:41 +08:00   ❤️ 1
    这种stash然后再apply的方式是可行的,但还不够自动

    你最好的方法就是在服务器上checkout -b一个deploy分支。master分支所有机器上都要一致,就是你的代码主分支。然后在deploy分支你就可以commit服务器上对配置文件的修改。以后master分支有更新的时候,你只需要在deploy分支merge一下master分支就可以了,这样你服务器上的配置也会被git管理起来,很方便。

    而且deploy分支只是服务器上的本地分支,没有push出去,不存在泄露你服务器上配置(比如密码,token等)的风险。

    再延伸,你甚至可以写一个钩子,让这些工作自动化,这样你只要在开发环境push一下,就能自动部署了
    imcotton
        5
    imcotton  
       2012-08-18 17:47:20 +08:00
    git update-index --assume-unchanged
    kingwkb
        6
    kingwkb  
       2012-08-18 17:54:46 +08:00
    @9hills deploy没有push出去的话,那么在本地可以把代码merge到deploy分支吗,我没怎么用过git,一直svn,现在大家都用git做为部署工具了吗?这样有不好的地方吗? 好的话就切换到git去
    Rabbit52
        7
    Rabbit52  
    OP
       2012-08-18 18:06:33 +08:00
    @9hills 谢谢,哪天试看看!
    9hills
        8
    9hills  
       2012-08-18 18:28:54 +08:00
    @kingwkb 可以。git作为部署工具的好处是可以写钩子,全自动化。只要你本地push一下master,服务器那边就自动部署了,不用你再ssh到服务器,cp代码,reload/restart服务


    @Rabbit52 这种方法当你在master中对配置文件进行升级后,merge时有可能会冲突。但这个是必须手动处理的。。。随便什么工具,代码冲突必须得手动处理的。。。你可以在钩子函数中加上相关判断,如果需要手动处理则邮件你之类的
    Rabbit52
        9
    Rabbit52  
    OP
       2012-08-18 18:54:34 +08:00
    @9hills 嗯,懂了。谢谢你哦,写了这么多
    aleung
        10
    aleung  
       2012-08-18 21:38:02 +08:00
    配置数据不应该跟源代码放在一起吧,放个配置文件模板,另外用脚本去更新配置文件
    agassi_yzh
        11
    agassi_yzh  
       2012-08-19 17:28:09 +08:00
    不知道你用什么语言写的哦。我用php根据apache的ServerAdmin来判断环境。

    如果开发用dev,服务器上生产环境用production。在php代码中判断就好了。不需要在服务器上操作啊。
    clino
        12
    clino  
       2012-08-19 21:53:14 +08:00   ❤️ 1
    也可以在本地先提交,然后 git pull --rebase
    supersheep
        13
    supersheep  
       2012-08-26 12:34:09 +08:00
    有些点看得不是太明白。
    按照自己的理解,是不是说我在客户端 push 了之后
    在服务器端
    checkout master ,pull , checkout deploy, merge master呢?
    但是这样checkout master的时候服务器上配置会不正确
    是哪个地方理解错误了,请大家更正。
    NemoAlex
        14
    NemoAlex  
       2012-08-26 14:53:04 +08:00   ❤️ 2
    @supersheep 服务器不要老在分支之间 checkout 啊,业务还在进行的同时,这改来改去吃得消么
    可以在 deploy 分支执行“git fetch --all”把所有的分支都更新下来,然后“git merge master”

    不过最好的办法,也是我建议诸位做的:把配置集中在一个或者少量的配置文件里,在版本控制系统中维护一份配置文件的模板,ignore 掉真正的配置文件
    在配置文件内容有修改的时候,手动维护服务器上的配置文件与模板保持一致
    clino
        15
    clino  
       2012-08-26 15:49:14 +08:00
    建议多用rebase少用merge,其实svn的方式相当于rebase做完以后一条线,git merge做多了版本图太复杂
    supersheep
        16
    supersheep  
       2012-08-26 16:00:58 +08:00
    @NemoAlex 嗯,还没正式开业所以敢这么干。这个思路大概理解了,多谢,之前也是觉得应该把配置放在ignore中,怕就怕一多自己忘了。配置文件的模版可否理解为开发环境中的配置?不然每次改动手动维护模版也会比较吃力吧。
    Rabbit52
        17
    Rabbit52  
    OP
       2012-08-26 16:11:29 +08:00
    @NemoAlex 这个方法挺好诶,版本库里面只有配置文件的模板,然后在不同环境重命名出来,直接将它忽略掉!
    dn
        18
    dn  
       2012-08-26 16:28:28 +08:00
    为安全计最好不要用git来更新生产环境配置文件

    我这边的解决方案是,check in的文件名是:config.default.js ,然后使用的文件是config.js
    并且需要把config.js放弃.gitignore 文件中。

    这样git pull的时候不会有merge问题。

    代码更新之后,diff配置之后,手动更新配置文件。

    然后重启项目,运行
    Rabbit52
        19
    Rabbit52  
    OP
       2012-08-26 17:00:20 +08:00
    @dn 还有 .gitignore 这个,我才学到,跪谢!!!!
    hpyhacking
        20
    hpyhacking  
       2012-08-26 18:53:06 +08:00
    @Rabbit52 .gitignore不能解决你的问题,这个文件一样要放在库中共享,你单独对服务器上的版本进行修改一样会收到更新提示。整个的问题属于部署范畴,好的解决方法是不要去理会什么开发环境中的配置文件,生产环境通过部署覆盖一份私有的配置文件即可。
    Rabbit52
        21
    Rabbit52  
    OP
       2012-08-26 20:50:49 +08:00
    @hpyhacking 能啊!我已经解决了,而且完美,嘿嘿
    http://rabbit52.com/2012/devel/deploy-with-git
    supersheep
        22
    supersheep  
       2012-08-26 21:18:05 +08:00
    @NemoAlex
    试用了你的方法,按理应该正确,但是却出现了如下结果
    git fetch --all

    remote: Counting objects: 74, done.
    remote: Compressing objects: 100% (47/47), done.
    remote: Total 47 (delta 36), reused 0 (delta 0)
    Unpacking objects: 100% (47/47), done.

    from /home/git/fdz
    af16fbe..0e2cbde master -> origin/master

    git merge master
    Already up-to-date.
    没有出现预期中显示合并信息的情况,pull时才被merge。pull难道不是fetch+merge么?

    git pull origin master

    * branch master -> FETCH_HEAD
    Merge made by the 'recursive' strategy.
    application/config/form_validation.php | 4 ++--
    application/controllers/meal.php | 2 +-
    application/views/frag/footer.php | 14 +++++++-------
    application/views/frag/header.php | 12 ++++++------
    ...
    berryphone
        23
    berryphone  
       2012-08-26 21:44:27 +08:00
    兔子哥,我是来打酱油的~
    NemoAlex
        24
    NemoAlex  
       2012-08-26 21:48:53 +08:00
    @supersheep Sorry,应该是“git merge origin master”才对,少写了个 origin
    或者你可以不执行 fetch 操作,直接“git pull origin master”
    Rabbit52
        25
    Rabbit52  
    OP
       2012-08-26 22:07:27 +08:00
    @berryphone 你叫我哥,不埋汰我嘛。疯子哥
    Rabbit52
        26
    Rabbit52  
    OP
       2012-08-28 22:15:17 +08:00
    @supersheep 应该是git merge origin/master
    yaotian
        27
    yaotian  
       2012-08-28 22:21:49 +08:00
    看我总结的文章,应该对你有帮助 https://github.com/yaotian/doc/blob/master/git.md
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1379 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 23:50 · PVG 07:50 · LAX 15:50 · JFK 18:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.