【问题标题】:git checkout modifies too many filesgit checkout 修改了太多文件
【发布时间】:2013-10-29 10:31:47
【问题描述】:

我正在使用 git 发布一个网站。 工作流程大致是:

$ git add my_file
$ git commit -m comment my_file
$ git push # Just house-keeping, goes to my master repo
$ git push ssh://user@webserver//var/www/repo.git

Web 服务器上的 post-receive 挂钩如下所示:

#!/bin/bash

working=$(pwd)
working=${working##*/}
working=../${working%.*}
while read oldrev newrev ref ; do
    branch=$(echo ${ref} | cut -d/ -f3)
    GIT_WORK_TREE=${working} git checkout -f ${branch}
done

在绝大多数情况下,这都可以正常工作。 当我说好时,我的意思是,如果我添加了一个文件,结帐会修改那个文件。

只有当我等待一天然后再次提交并推送时,post-receive 挂钩中的 git checkout 才会重新获取我工作副本中的每个文件。它不仅需要很长时间,而且会与我稍后运行的 rsync 混淆。

什么会在一夜之间发生,以至于明天发生的结帐与我今天可以一遍又一遍地重复的结帐完全不同?

【问题讨论】:

    标签: git git-checkout git-post-receive


    【解决方案1】:

    您是否在使用分支?从您的 post-receive 钩子看来,您没有过滤要使用哪个 ref 来托管您的网站代码。相反,它对每个修改过的 ref 进行检查。如果您将一些代码推送到另一个分支,那么您的站点将被更新以反映这一点。我认为您可能只想为重要的 ref 运行结帐(可能是 refs/heads/master),仅此而已。

    也许会改变

    while read oldrev newrev ref ; do
        branch=$(echo ${ref} | cut -d/ -f3)
        GIT_WORK_TREE=${working} git checkout -f ${branch}
    done
    

    while read oldrev newrev ref ; do
        if [ "$ref" == "refs/heads/master" ]; then
            branch=$(echo ${ref} | cut -d/ -f3)
            GIT_WORK_TREE=${working} git checkout -f ${branch}
        fi
    done
    

    【讨论】:

    • 我根本不使用分支。所以我总是看到 git 提到我已经在 master 上了。但是,为了消除歧义,我将简化 post-receive 挂钩。最大的问题是它大部分时间都可以工作,但如果我从上次推送超过一天后推送就会失败。
    • 除此之外:而不是cut -d/ -f3,通常最好用${ref#refs/heads/} 剥离refs/heads/,以免将refs/heads/foo/bar 之类的分支名称视为foo 而不是@ 987654329@。在这种情况下不是问题,但是在这种情况下,您可以只做branch=master。 :-)
    • 是的。我只是向他展示了如何对块进行条件化,如果它不明显的话。我更喜欢使用您自己指出的符号。但你是绝对正确的,在这种情况下,它可以被清理为branch=master,或者只是将分支名称放入结帐命令中。
    猜你喜欢
    • 2020-05-19
    • 2018-11-05
    • 2010-12-03
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 2017-12-26
    相关资源
    最近更新 更多