Git将代码推送到非裸仓库,如何保存当前工作目录?

3
我如何向非裸的git仓库推送内容,自动添加和提交工作树中的任何更改,然后重新检出当前分支以反映该推送的更改?
我考虑到像这样的一些方法:
在远程上(非裸仓库)添加钩子来运行git add . && git commit -m "Automated commit" && git reset --hard
这种方法有什么缺点吗?还有其他方法吗?
(免责声明:我知道这不是最理想的情况,但这就是我们公司所拥有的,我想让它尽可能简化,而不需要每个人都完全改变他们的做事方式)
谢谢!
1个回答

1
在折腾一番后,我找到了一个相当好的解决方案。 Pre-receive hook: 检查工作目录中的任何更改,添加/提交它们,然后提醒用户在推送之前需要合并。
#!/bin/sh
cd ../
unset GIT_DIR
CHANGED=$(git diff-index --name-only HEAD --)
if [ -n "$CHANGED" ]; then
    git add -u .
    git commit -m "Automated commit"
    echo "There were uncommitted changes in the working directory...please pull them and push your changes again"
    exit 1
fi 
提交后钩子:强制检出当前分支,以便更改将显示在工作目录中。这将覆盖工作目录中的任何更改,但这些更改已经由预接收钩子添加/提交/合并。
#!/bin/sh
cd ../
unset GIT_DIR
branch=$(git branch | sed -n -e 's/^\* \(.*\)/\1/p')

git checkout -f $branch


echo "Update pushed to branch $branch and checked out in the website directory" 

1
我对这些脚本感到非常不满意,因为它们很糟糕:1)为什么没有 set -e -u?如果脚本的任何部分失败了会发生什么?2)为什么要使用 git-branch | sed 来替代 git rev-parse HEAD?3)文档中哪里说运行钩子时假定某个当前目录?为什么要明确取消设置 GIT_DIR - kostix
如果您有更好的答案,请提供一个。我从Stack Overflow上的另一个问题中获取了git分支| sed。我进行了一次检查,看看当前目录是什么,结果是.git目录的根目录。存在一个问题,即如果您CD,则必须显式取消设置GIT_DIR,如果要使git命令使用当前目录而不是GIT_DIR的值。 - jraede
我没有即时的答案,我想指出“模拟航空公司编程”和毫无头脑地复制和粘贴随机代码片段并不是一个好的实践。这就是为什么它是一条评论——它与问题本身无关。 - kostix
很好,我在这里提出问题的原因是因为我不知道如何做。当答案已经在堆栈溢出上并且有效时,我不会花费数小时去理解git-branch | sedgit rev-parse之间的区别。 - jraede
第一个钩子给了我“在隔离环境内禁止更新引用”的错误提示。 - Fanky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接