导出git修改的文件

前言

在实际开发中,有时候只提交修改过的代码,之前我的做法是一个一个文件地复制,这种方法速度慢,而且容易出错。在网上找了一下,其实用Git的功能就可以实现差分代码提交。

基本思路大致是用git diff取出两个版本之间的差异文件,用git archive来打包差异文件。
该方法只能在Bash下执行,所以在Windows下,要用到Git自带的Bash。

1.查看差异文件

要导出Git仓库中某两次提交之间的文件差异,必须要先知道有哪些文件发生了差异。
git diff指令能很方便的协助我们完成这样的操作。

本次使用到的git diff指令的用法:
git diff COMMIT_ID_1 COMMIT_DI_2,其中的COMMIT_ID_X就是通过git log指令查看到的提交ID。

示例(取当前提交到上一次提交的文件):

1
git diff --name-only 69351d6..035b375

或者

1
git diff --name-only HEAD~1...HEAD

一般情况下,commit_id取前七位就可以了

2.配合archive打包

git archive -o 导出文件名.zip 导出版本号 $(git diff –name-only 旧版本号..新版本号)
一般来说,导出版本号和新版本号是一样的,示例:

1
git archive -o update.zip 035b375 $(git diff --name-only 69351d6..035b375)

或者

1
git archive -o update.zip HEAD $(git diff --name-only HEAD~1..HEAD)

Git的版本号比较长,有40位,一般来说,取前七位就行。导出的ZIP是按目录生成的,这样提交差异代码时也非常方便。

3.结合xargs打包

仔细观察git diff –name-only指令的执行结果,这不正是这些文件在根目录中的相对地址嘛?
结合xargs指令可以非常快速地将差异文件给打包了。
可以用tar指令进行压缩,示例:

1
git diff --name-only 69351d6...035b375 | xargs tar -zcvf update.tar.gz

指定某个打包输出目录:

1
git diff --name-only 69351d6...035b375 | xargs tar -zcvf /d/update.tar.gz

就会在D盘下面新增一个update.tar.gz 打包文件,如果我们固定一个打包输出目录,这个命令非常有用。

执行本打包指令的时候,一定要在项目的根目录中执行,以为不论是在项目目录中的哪个位置,git
diff指令输出的文件路径都是相对于项目根目录的,在非项目根目录下执行xargs tar的时候会提示找不到文件

4.快捷用法

以上的COMMIT_ID_X其实可以用HEAD来代替,比如HEAD表示当前提交,HEAD^表示上一次提交,HEAD^^表示上上次提交,所以我们输出当前和上次提交的差异就可以写成这样git diff –name-only HEAD^ HEAD。
其中可以省略后面的HEAD,因为指令会默认拿HEAD^和当前提交作比对;
还有一种写法:HEAD~0表示当前提交,HEAD~1表示上一次提交,HEAD~2表示上上次提交,以此类推。

关于Git中的HEAD定义,《Git版本控制管理中》是这样描述的:「HEAD始终指向当前分支的最近提交。当切换分支时,HEAD会更新为指向新分支的最新提交」

结语

本篇文章我们提到了两种打包方法分别是diff+archive,diff+xargs(支持自定义打包输出目录),两种方法打包结果都一致。里面的目录结构和项目的结构保持一致,并且只包含差异文件,这就是我们所需要的。不过保证打包的正确、可靠性,打包后建议还是自己再检查一遍,特别是需要发布到线上版本的打包文件。

相关链接:
https://git-scm.com/docs/git-archive
https://git-scm.com/docs/git-diff
https://www.runoob.com/linux/linux-comm-xargs.html

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 前言
    1. 1.1. 1.查看差异文件
    2. 1.2. 2.配合archive打包
    3. 1.3. 3.结合xargs打包
    4. 1.4. 4.快捷用法
  2. 2. 结语
,