摘要
本文介绍了一种同步代码的方法,适用于直接在远程服务器上调试,并修改了代码。但是因为服务器上没有配置 git 用户信息,或无推权限,而需要将修改的代码同步到本地电脑的开发环境上,如何不走 git remote repo 推送达到同步的目的。
正文
一种利用 git apply 同步两端 git 文件变动的方法。
有这样一种工作场景,有一个问题需要调试在线上。这个问题如果直接在线上调试则比较容易定位和修复,因为问题是在生产环境发现的,所以在生产环境复现相较于本地更容易,所以直接在服务器上修改代码然后启动并确认修复。假设现在代码经过验证是没有问题的,能够接受,那么接下来的事情就是把刚刚修复的代码提交记录并且推送到远程 git 仓库上。然而服务器上 git 客户端没有配置 user.name 和 user.email 信息。甚至有可能服务器上的这个仓库没有远程的推送权限。好的,那么你怎么将更新的代码同步到远程仓库呢?我知道可以通过设置 user.name
等信息配置一下 git 客户端,并且最多增加一个推送的权限来解决从服务器推送代码的问题。但是在服务器上配置 git 用户名和邮箱有些唐突,特别是当服务器是多个用户共用的的时候,配置哪一个用户名都不好。能否将服务器上的代码更新记录同步到本地仓库,然后再由本地仓库推送到远程仓库呢?
可以用 git apply
命令来更新 patch 到本地版本中,当然两者的基版本应该是一致的,只要都是最新的就不成问题。
先在服务器上创建 patch 文件,比如通过 git diff
命令重定向输出到文件 a.patch。
现在的问题将转化成了如何将 a.patch 下载到本地了。方法有很多种,可以通过 scp
或者 http 服务。即便远程服务器和本地不能直接通信,也是可以通过 http代理+http服务实现。大不了 cat 到终端然后复制到剪切板,也就同步到了本地。
别忘了创建的 a.patch 文件其实是不需要提交的,可以在创建后移除,或者一开始就指定路径,如 /tmp/a.patch
。
附录:Git Patch
以下内容摘自《Git Notes for Professionals. 100+ pages》by GoalKicker.com and the beautiful people at Stack Overflow.
创建一个 patch
欲创建一个 patch, 有两步
- 做出变更并且提交它们
- 运行
git format-patch <commit-reference>
以将所有自<commit-reference>
(不包含)后的提交转换到 patch 文件中
例,若 patchs 需从最近的两次提交中生成,则
git format-patch HEAD~~
会生成两个文件,每个提交都自HEAD~~始,就像这样
0001-hello_world.patch
0002-beginning.patch
Applying patches
We can use git apply
some.patch to have the changes from the .patch file applied to your current working directory. They will be unstaged and need to be committed.
To apply a patch as a commit (with its commit message), use
git am some.patch
To apply all patch files to the tree:
git am *.patch