我刚刚第一次使用Web Hooks部署到我的服务器上。 但是,我在努力理解git命令,尤其是在命令末尾结帐吗?
这是我正在使用的命令:
git --work-tree=/location/ --git-dir=/source.git/ checkout -f
我不确定结帐到底在做什么?如果有人可以解释,那将为我带来困扰,这将有所帮助。
答案 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。