Git推送结账?

PiT*_*ber 6 git

我想将我的文件直接推送到我的Web服务器.我添加了服务器testing并尝试了

git push testing
Run Code Online (Sandbox Code Playgroud)

但是我得到了这个错误.制作裸存储库的解决方案可行但我希望自动检出文件.我找到了这个脚本,但没有改变任何东西.

我可以在第三个裸存储库上传输更改,但这只需要很长时间:

client:
git commit -m "test" -a
git push origin
<password>

server:
git pull origin/master
Run Code Online (Sandbox Code Playgroud)

更新(2)

我在服务器上创建了一个新分支git branch testing.

同样在服务器上我创建.git/hooks/post-update了一个添加的:

echo "a" >> /home/pi/log
git update-server-info
git stash
git merge testing >> /home/pi/log
Run Code Online (Sandbox Code Playgroud)

在我运行的客户端上

git push testing HEAD:testing
Run Code Online (Sandbox Code Playgroud)

现在我的/home/pi/log包含:

a
Updating ae2f44b..04753a9
Fast-forward
 application/views/main/index.php |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
Run Code Online (Sandbox Code Playgroud)

但文件没有改变.还有什么可能是错的?

Von*_*onC 5

您现在如何“推送到部署”(git 2.4,2015 年 5 月),它改进了“推送到结账”(Git 2.3,2015 年 2 月)

有关具体示例,请参阅“使用 Git push 部署项目”。

简而言之,您可以直接推送到已检出的分支(有警告)。
提交 4d7a5ce


更新:在 Git 2.30(2021 年第一季度)中,您现在有一个示例“ push-to-checkout”钩子,其执行与内置默认操作相同的操作。

请参阅Adam Spiers ( ) 的提交 e632c46(2020 年 10 月 15 日(由Junio C Hamano合并-- --df7f850 提交中,2020 年 11 月 2 日)aspiers
gitster

hook:添加示例模板 push-to-checkout

签字人:亚当·斯皮尔斯

该模板或多或少是对 C 代码 shell 的精确转换,用于在push_to_deploy()函数中定义的 git 推送到结账钩子的默认行为,builtin/receive-pack.c作为修改的方便起点。

它还包含从 git-config(1) 和 githooks(5) 手册页中提取的相关文本。

那是:

在 git push 上更新检出树的示例钩子脚本。

该钩子被调用git-receive-pack时,它发生反应git push,并在其储存库的更新参考(多个),并且当推尝试更新分支当前检出和receive.denyCurrentBranch配置变量被设定为updateInstead

默认情况下,如果远程存储库的工作树和索引与当前检出的提交有任何差异,则拒绝这种推送;当工作树和索引都与当前提交匹配时,它们会更新以匹配新推送的分支尖端。

此钩子用于覆盖默认行为;然而,下面的代码重新实现了默认行为,作为方便修改的起点。

钩子接收将更新当前分支的提示的提交:

commit=$1
Run Code Online (Sandbox Code Playgroud)

它可以以非零状态退出以拒绝推送(这样做时,它不得修改索引或工作树)。

die () {
   echo >&2 "$*"
   exit 1
}
Run Code Online (Sandbox Code Playgroud)

或者它可以对工作树和索引进行任何必要的更改,以在当前分支的尖端更新为新提交时将它们带到所需的状态,并以零状态退出。

例如,钩子可以简单地运行git read-tree -u -m HEAD "$1" 以模拟git fetch以相反方向运行的git push,因为 的二叉树形式git read-tree -u -m本质上与git switchgit checkout切换分支同时保持工作树中不干扰的本地更改与分支之间的差异。

下面是一个更或多或少准确翻译为GIT中的壳的默认行为的C代码push-to-checkout中所定义的钩push_to_deploy()在功能builtin/receive-pack.c

请注意,挂钩将从存储库目录中执行,而不是从工作树中执行,因此如果您想在工作树上执行操作,则必须相应地调整您的代码,例如通过添加“ cd ..”或使用相对路径。