Git Hooks post receive未按预期工作
我通过在/var/repo/app.example.com.git dir上运行git init-bare并添加代码为Git Hooks post receive未按预期工作,git,bitbucket,Git,Bitbucket,我通过在/var/repo/app.example.com.git dir上运行git init-bare并添加代码为 #!/bin/bash git --work-tree=/var/www/app.example.com --git-dir=/var/repo/app.example.com.git checkout -f 那就做吧 sudo chmod +x post-receive 然后在我的本地回购中,我添加了一个远程 git remote add deploy-dev ssh:/
#!/bin/bash
git --work-tree=/var/www/app.example.com --git-dir=/var/repo/app.example.com.git checkout -f
那就做吧
sudo chmod +x post-receive
然后在我的本地回购中,我添加了一个远程
git remote add deploy-dev ssh://user@serverip/var/repo/app.example.com.git
当我第一次运行它时,它工作正常
git push deploy-dev dev
我在dev分支上添加了更改,然后在dev上推送
git push -u origin dev
在成功地推动开发分支之后,我运行
git push deploy-dev dev
它没有对dev分支应用我的最后一次推送
有什么建议吗?让我解释一下你在做什么: 首先,您为远程分支deploy-dev添加了一个远程url。然后,您将本地分支dev推送到远程分支deploy-dev 然后你犯了一个错误: git推送-u源开发 git push-u origin意味着,您将当前分支dev推送到名为dev的远程分支。之前您将远程分支命名为deploy-dev。因此,我猜当您运行git fetch时,您将看到2个远程分支 请参考:
如果添加了远程url,并将远程分支设置为本地分支的上游。最后,您只需检查自己是否在正确的分支上,是否可以使用git push。以99.997%的概率,问题是您正在签出master,而不是dev 每个存储库都有自己的当前分支 所有Git存储库(包括服务器上的一个存储库)都有以下部分: 存储库数据库本身,存储主分支的对象和引用,如refs/heads/master; 一个头部,用于存储当前分支; 索引,用于构建下一次提交;和 可选的工作树,您可以在其中进行工作。 -bare存储库(core.bare配置为true)会忽略工作树,但您可以临时设置工作树 和往常一样,当前分支是存储在HEAD中的分支 在裸存储库中,索引没有直接的用途:因为索引的主要目的是将其与工作树一起使用,以构建下一个要进行的提交,并且裸存储库没有工作树,所以除非编写接收后部署脚本,否则其索引不会得到任何练习 想想当前的分支 您的post-receive钩子只有一行,非常简单:这意味着每次服务器有任何东西,比如一个新的标记被推到它上面时,它都会运行一行命令:
git --work-tree=/var/www/app.example.com \
--git-dir=/var/repo/app.example.com.git \
checkout -f
为了便于展示/讨论,我把这一行分成了三行。考虑一下这些部分的作用:
--work-tree=...
指定一个工作树,以便git命令作为其工作树在该路径上工作。这将覆盖任何core.bare设置:生成的Git命令有一个工作树。下一步:
--git-dir=...
这将覆盖查找Git目录的默认方法。它将在给定的存储库中工作,无论$GIT_DIR设置为什么,也不管启动它时它实际运行在哪个目录中
checkout -f
您应该熟悉这个命令。它有什么作用
您已经知道git checkout签出了一个分支。可以拼写为-force的-f选项告诉Git,即使签出将覆盖未保存的工作树文件,也应该继续并覆盖它们。但是:这是哪家分行的支票
存在一些可读性问题,但它确实包含以下答案:
git签出
要准备工作,请通过更新工作树中的索引和文件,并将头部指向分支来切换到它。保留对工作树中文件的本地修改,以便将其提交到工作树。
...
您可以省略,在这种情况下,命令将退化以签出当前分支。。。
我的黑体字
如果您打算部署某个特定分支,最好是当前分支,如果您使用这种形式的git签出
请注意,git签出也取决于当前索引:它假设当前索引在某种意义上描述了当前工作树。这就是索引也称为缓存的原因。Git在索引中缓存关于工作树的信息,并使用它来避免仔细查看工作树(如果可以的话)。这是Git的速度秘密之一:通过比较工作树的一些快速查找信息和存储在类似缓存的索引中的一些快速查找信息,Git可以跳过工作树上的一些缓慢操作
如果您使用-work tree=将工作树从Git下调出,那么索引最好现在就描述这个工作树,而不是其他工作树。如果您的post receive部署脚本始终使用单个工作树,并且始终从裸存储库进行部署,那么这是可以的,但如果不是,则不是
Git部署还有其他更奇特的方法,它们有不同的限制或没有限制,但这里的关键要点是:
仅在裸存储库中使用此选项。
只使用一个工作树参数。如果需要更多,请使用更高级的部署脚本。
请记住,这将部署当前分支,而不管有人推了什么。如果你需要
如果出现其他情况,请不要使用此部署脚本。如果只有一个分支要部署,请在运行此部署脚本之前将其设置为当前分支,或者修改此部署脚本以读取git checkout,使其在每次部署期间成为当前分支。无论哪种方式,您现在都将其作为基础存储库的当前分支,因此请确保这也可以!