Git Deploy Web Hook命令-不太了解。

时间:2018-09-17 16:07:39

标签: git deployment

我刚刚第一次使用Web Hooks部署到我的服务器上。 但是,我在努力理解git命令,尤其是在命令末尾结帐吗?

这是我正在使用的命令:

git --work-tree=/location/ --git-dir=/source.git/ checkout -f

我不确定结帐到底在做什么?如果有人可以解释,那将为我带来困扰,这将有所帮助。

1 个答案:

答案 0 :(得分:0)

这使用Git作为部署工具,有点像用扳手作为锤子:它可以工作,但是有充分的理由不这样做。

运行:

git --work-tree=/location/ --git-dir=/source.git/ checkout -f

与运行非常相似:

git checkout -f

我在这里假设您已经习惯使用带有{em>分支名称的git checkout来签出特定分支。如果咨询the git checkout documentation,您会发现也可以运行git checkout 而没有分支名称:

  

您可以省略 branch ;,在这种情况下,该命令将退化为“检出当前分支”,这是一个夸张的no-op,具有相当昂贵的副作用,只能显示跟踪信息(如果存在),则用于当前分支。

也就是说,如果此特定存储库当前位于分支master上,则运行git checkout表示git checkout master,它已经存在。因此,现在让我们注意--git-dir--work-tree选项-这意味着要查看the front-end git command documentation。实际上,最重要的部分是--work-tree选项,因为--git-dir参数已经被设置为运行Git钩子(Git钩子已预先设置$GIT_DIR来运行) ):

  

--work-tree=path

     
    设置工作树的路径。 ...

从本质上讲,这告诉Git:不要在通常的位置查找工作树,而是在其他path位置中查找。在“裸” Git存储库(在Web服务器上)中,通常Git存储库本身被设置为完全没有 no 工作树。因此,您必须使用--work-tree(或其他等效方法)来强制Git假定该其他目录(例如/location/)包含已签出的存储库。

然后,checkout动词告诉Git提取当前工作树中的所有内容(在此其他位置),然后重新签出当前分支,无论当前分支是什么(可能是{{1 }})。 master选项是-f的选项,它代表 force ,表示:即使此结帐会破坏正在进行的工作,也还是要这样做。通常,git checkout注意不要覆盖进行中的工作。

当然,在您的Web服务器上,不应有任何正在进行的工作:部署位置中的文件可能应该与Git认为的相匹配。因此,git checkout 通常是不必要的。但是,Git认为工作树中的整个想法本身就是一个问题。 Git通过Git所谓的 index 跟踪工作树。如果您过于努力地使用Git本身作为部署工具来推动部署想法,您会发现Git的坚持不懈会破坏部署。这是为什么,就像用扳手锤子一样:如果您轻轻地用力或知道自己在做什么并且要小心,它就会起作用,但是如果您要锤打很多,扳手可能会破裂。

有关涵盖这两个论点的前Git-as-deployment-tool工具文章,请参见https://www.freelock.com/blog/john-locke/2015-06/case-git-deployment-tool。另请参见Deploy code using GIT - checkout vs reset --hard?git post-receive hook doesn't seem to process other branches