我有一个提供 git 存储库的服务器,裸露的,它们可以像平常一样拉出和推送到。
为了方便起见,我希望支持通过侧通道发送补丁并让服务器将这些补丁应用到相关分支。
但是据我所知,
git am
和git apply
都不支持使用裸存储库,将补丁应用于树形对象。
显然,总是可以创建一个工作树或带有工作副本的克隆并对其应用补丁,但这会造成大量的 FS 流失,所以我想知道是否有一种方法可以内置执行此操作,而无需解析并“手动”将补丁应用于各个斑点。
显然,总是可以创建工作树或克隆工作副本并对其应用补丁,但这会造成大量 FS 流失
Git 始终能够进行最小检出合并/应用,您永远不需要为此进行完整检出。
如果您在裸克隆服务器上并且想要更新
HEAD
,
$ git clone -ns . `mktemp -d`; cd $_
$ git read-tree HEAD
$ git apply -3 <the.patch
然后申请只会得到它需要的东西。然后,您可以
git commit-tree
树 git write-tree
生成并将生成的提交推回到您想要的位置。
我使用从邮件列表中获取的 Git 补丁来完成此操作,“[PATCH 1/6] refs:正确地将排除模式应用于命名空间引用”,基本上什么也没做:
[jthill@denisov jthill]$ cd git
/home/jthill/src/git
[jthill@denisov git]$ git clone -ns . `mktemp -d`; cd $_
Cloning into '/tmp/jthill/tmp.vQh1so35iL'...
done.
[jthill@denisov tmp.vQh1so35iL]$ git read-tree HEAD
[jthill@denisov tmp.vQh1so35iL]$ wl-paste|sed s,\\r$,,|git apply --cached -3
Applied patch to 'refs.c' cleanly.
Applied patch to 'refs.h' cleanly.
Applied patch to 't/t5509-fetch-push-namespaces.sh' cleanly.
[jthill@denisov tmp.vQh1so35iL]$ du -sh .git .
608K .git
4.0K .
然后您可以根据需要
git write-tree
和git commit-tree
和git push
回到您的裸存储库。