我刚刚第一次使用Web Hooks部署到我的服务器。但是,我很难理解git命令,特别是在命令结束时检查?
这是我正在使用的命令:
git --work-tree=/location/ --git-dir=/source.git/ checkout -f
我不确定结账时最终会做什么?如果有人能够解释,它会有所帮助,因为它令人困惑。
这使用Git作为部署工具,这有点像使用扳手作为锤子:它有效,但有充分的理由不这样做。
运行:
git --work-tree=/location/ --git-dir=/source.git/ checkout -f
与运行非常相似:
git checkout -f
我在这里假设您已经习惯使用带分支名称的git checkout
来检查特定分支。如果你咨询the git checkout
documentation,你会发现你也可以在没有分支名称的情况下运行git checkout
:
你可以省略分支;在这种情况下,命令退化为“检查当前分支”,这是一个带有相当昂贵的副作用的美化无操作,只显示当前分支的跟踪信息(如果存在)。
也就是说,如果此特定存储库当前位于分支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
Set the path to the working tree. ...
从本质上讲,这告诉Git:不要在通常的地方寻找工作树,无论在哪里,都要查看其他path
位置。在“裸”Git存储库(在Web服务器上),通常Git存储库本身被设置为根本没有工作树。因此,您必须使用--work-tree
(或任何等效的东西)强制Git假定此其他目录(例如/location/
)包含已签出的存储库。
然后checkout
动词告诉Git采取当前工作树中的任何内容(在这个其他位置)并重新检出当前分支,无论当前分支是什么(可能是master
)。 -f
选项是git checkout
的一个选项,它代表强制,意思是:即使这个结账会破坏一些正在进行的工作,无论如何都要这样做。通常git checkout
小心不要覆盖正在进行的工作。
当然,在您的Web服务器上,应该没有正在进行的工作:部署位置中的文件可能应该与Git认为的相匹配。所以-f
通常是不必要的。然而,Git认为在工作树中的这个概念本身就是一个问题。 Git通过Git调用其索引来跟踪工作树。如果你过分强调部署思路,使用Git本身作为部署工具,你会发现Git的keep-track打破了部署。这就是为什么它就像使用扳手作为锤子:如果你足够轻柔地使用它,或者知道你在做什么并且小心,它会起作用,但如果你做了很多锤击,扳手可能会断裂。
有关包含两个参数的pro-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。