如何将某怎样将几个文件打包包成一个git的压缩包文件

公司的项目原先是使用svn做版本管理,发布项目的时候是采用打包的方式压缩成zip格式的文件,然后用ftp上传。随着开发人员越来越多,需求变化也比较多,经常在开发新功能时要调整线上的问题,在一个分支上进行开发就非常不方便。虽然svn也支持多分支开发,但是操作非常不便,于是就把项目的版本管理切换成了git。
切换成git之后,为了平缓的过度,发布项目的时候还是打算使用打包的方式,然后ftp上传。那么问题就来了:git如何提取出两个提交之间的差异文件呢?
一开始找了git format-patch和git archive都没有找到需要的功能,后来就去查git diff命令,找到了方法。
git diff这个命令能比较两个提交之间的差异,使用–name-only参数可以只显示文件名。例如:
$ git diff 608e120 4abe32e --name-only& & & & & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & & & & & & & & & &git diff列出两个提交之间差异的文件
diff列出两个提交之间差异的文件
就能成功打包了。只是这样的话也太麻烦了吧,幸好linux有提供一个命令xargs能将前一个命令的输出转成另外一个命令的参数,按照这个思路就非常简单了
$ git diff 608e120 4abe32e --name-only | xargs zip update.zip &&&
git diff列出两个提交之间差异的文件结合xargs进行打包
git diff列出两个提交之间差异的文件其实这种发布方式并不是非常好,如果线上的环境也能使用版本管理就非常方便了,只是这需要多方面的的配合。从某种意义上来讲,这种打包更新方式只是一种折中的处理方式。
还一个问题是这样的:提交的排序是按照时间来进行的,如果有分支合并进来的,可能分支里的提交时间在上次发布的提交时间之前,这样是否会漏打包到文件呢?答案是不会的,因为合并分支会产生一个新的提交,这个提交一定是在上次发布的提交之后。
注:常用命令
git diff&filename&查看尚未暂存的某个文件更新了哪些
git diff –cached&filename&查看已经暂存起来的某个文件和上次提交的版本之间的差异
git diff ffd98b291e0caa6c5eae661ce40c9 b8e7b00c02b95b320f14b625663fdecf2d63e74c 查看某两个版本之间的差异
git diff ffd98b291e0caa6c5eae661ce40c9:filename b8e7b00c02b95b320f14b625663fdecf2d63e74c:filename 查看某两个版本的某个文件之间的差异
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:11763次
排名:千里之外
原创:79篇
转载:105篇
(2)(5)(5)(11)(39)(2)(31)(20)(69)Git如何Check Out出指定文件或者文件夹 - 推酷
Git如何Check Out出指定文件或者文件夹
在进行项目开发的时候,有时候会有这样的需求那就是:我们只希望从Git仓库里取指定的文件或者文件夹出来。在SVN里面,这非常容易实现,因为SVN基于文件方式存储,而Git却是基于元数据方式分布式存储文件信息的,它会在每一次Clone的时候将所有信息都取回到本地,即相当于在你的机器上生成一个克隆版的版本库。因此在Git1.7.0以前,这无法实现,但是幸运的是在Git1.7.0以后加入了Sparse Checkout模式,这使得Check Out指定文件或者文件夹成为可能。
具体实现如下:
$mkdir project_folder
$cd project_folder
$git remote add -f origin &url&
上面的代码会帮助你创建一个空的本地仓库,同时将远程Git Server URL加入到Git Config文件中。
接下来,我们在Config中允许使用Sparse Checkout模式:
$git config core.sparsecheckout true
接下来你需要告诉Git哪些文件或者文件夹是你真正想Check Out的,你可以将它们作为一个列表保存在.git/info/sparse-checkout文件中。
$echo “libs” && .git/info/sparse-checkout
$echo “apps/register.go” && .git/info/sparse-checkout
$echo “resource/css” && .git/info/sparse-checkout
最后,你只要以正常方式从你想要的分支中将你的项目拉下来就可以了:
$git pull origin master
具体您可以参考Git的Sparse checkout文档:
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致3092人阅读
版本控制(46)
一、打包文件索引
首先, 我们来看一下打包文件索引, 基本上它只是一系列指向打包文件内位置的书签.
打包文件索引有两个版本.
&版本1的格式用于Git 1.6版本之前, 版本2的格式用于Git 1.6及以后的版本.&
但是版本2可以被Git 1.5.2及以上的Git读取, 同时也被后向移植(backport)到了1.4.4.5版本.
版本2包含了每个对象的CRC校验值, 因此在重打包的过程中,
压缩过的对象可以直接进行包间拷贝(from pack to pack)而不用担心数据损坏. 版本2的打包文件索引同时亦支持大于4G的打包文件.
在两个版本格式中,&sha1表存储的是对象的SHA1值,并把它们按照其SHA1值进行排序(以便于对这个表进行二分搜索),&&offset表存储的是sha1表中对应位置的对象在打包文件中的偏移值。
为了加速对象的查找,git使用了分段的思想,在打包文件中包含了一个fanout表。fanout表用一种特殊的方法指向offset/sha1表。
简单的说应该是这样的,fanout[0]表示的是SHA1值以0x00开头的所有的对象中SHA1值最小的对象在offset/sha1表中的偏移;fanout[1]表示的是SHA1值以0x01开头的所有的对象中SHA1值最小的对象在offset/sha1表中的偏移;fanout[2]表示的是SHA1值以0x02开头的所有的对象中SHA1值最小的对象在offset/sha1表中的偏移。以此类推,fanout[254]表示的是SHA1值以0xfe开头的所有的对象中SHA1值最小的对象在offset/sha1表中的偏移,fanout[255]表示的是SHA1值以0xff开头的所有的对象中SHA1值最大的对象在offset/sha1表中的偏移,它同时也表示了当前offset/sha1表的大小。
因此通过SHA1值查找一个对象时,首先通过SHA1值的前两位在fanout表中,确定它在offset/sha1表的一个区间范围,然后再在sha1表中根据SHA1值使用二分法进行查找。这样通过fanout表对于最坏的情况就减少了8次二分搜索迭代。
在第1版中,&offset(偏移)和SHA值存在在同一位置.
但是在第2版中, SHA值, CRC值和offset被放在不同的表中. 两个版本的文件最后都是索引文件以及指向的打包文件的CRC校验值.
很重要的一点是, 要从打包文件中提取(extract)出一个对象, 索引文件不是必不可少的. 索引文件的作用是帮助用户快速地从打包文件中提取对象. 那些&上传打包&(upload-pack)和&取回打包&(receive-pack)程序(译注: 实现push和fetch协议的程序)使用打包文件格式(packfile format)去传输对象, 但是没有使用索引
.因为 索引可以在上传或者取回打包文件之后通过扫描打包文件重新建立.
二、打包文件格式
打包文件格式是很简单的. 它有一个头部(header)和一系列打包过的对象(每个都有自己的header和body), 还有一个校验尾部(trailer). 前4个字节是字符串'PACK', 它用于确保你找到了打包文件的起始位置. 紧接着是4个字节的打包文件版本号, 之后的4个字节指出了此文件中入口(entry)的个数. 你可以用下面Ruby程序读出打包文件的头部:
def read_pack_header& sig = @session.recv(4)& ver = @session.recv(4).unpack(&N&)[0]& entries = @session.recv(4).unpack(&N&)[0]& [sig, ver, entries]end
头部之后是一系列按照SHA值排序的打包对象, 每一个打包对象包含了头部和内容.&打包文件的尾部是该文件中所有(已排序)SHA值的SHA1校验值(20字节长)(译注:
即按照排序好的顺序进行迭代SHA1运算).
&对象头部(object header)由1个或以上的字节按序组成, 它指出了后面所跟数据的类型及展开后的尺寸. 头部的每一个字节有7位用于数据,
第1位用于说明头部是否还有后续字节. 如果第1位是'1', 你需要再读入1个字节(译注: 即下一字节仍属于头部), 否则下一字节就是数据. 第一个字节的前3位指定了数据的类型, 具体含义参见下表.
(3个位可以组合成为8个数. 在当前的使用中, 0(000)是'未定义', 5(101)目前未被使用.)
这里我们举一个由两个字节组成的头部的例子. 第1个字节的前3位说明了数据的类型是提交(commit), 余下的4位和第2个字节的7位组成的数字是144, 说明数据展开后的长度是144字节.
值得注意的一点是, 对象头部中包含的'尺寸'不是后面跟着的数据的长度, 而是数据展开之后的长度. 因此, 打包索引文件中的偏移是很有用的, 有了它你不必展开每一个对象就可以得到下一个头部的起始位置.
对于非delta对象, 数据部分就只是zlib压缩后的数据流. 对于那两种delta对象, 数据部分包含了它所依赖的基对象(base object)以及用于重构对象的delta(差异)数据. 数据的前20个字节称为ref-delta, 它是基对象SHA值的前20个字节. ofs-delta存储了基对象在同一打包文件中的偏移. 任何情况下, 有两个约束必须严格遵守:
1、delta对象和基对象必须位于同一打包文件;
2、delta对象和基对象的类型必须一致(即tree对tree, blob对blob, 等等).
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3974125次
积分:29436
积分:29436
排名:第132名
原创:217篇
转载:377篇
译文:178篇
评论:359条
(1)(1)(5)(53)(31)(60)(2)(8)(2)(6)(1)(2)(1)(7)(3)(7)(7)(7)(8)(7)(21)(45)(7)(8)(33)(17)(248)(97)(88)(1)Git怎么将打了某个Tag的文件全部导出 - 移动开发当前位置:& &&&Git怎么将打了某个Tag的文件全部导出Git怎么将打了某个Tag的文件全部导出&&网友分享于:&&浏览:0次Git如何将打了某个Tag的文件全部导出?
1. 导出并压缩为 zip 格式:
$ git archive --format=zip --output=v1.0.zip 1.0
2. 导出并压缩为 tar.bz2 格式:
$ git archive 1.0 | bzip2 & v1.0.tar.bz2
3. 导出并压缩为 tar.gz 格式:
$ git archive --format=tar 1.0 | gzip & v1.0.tar.gz
查看存在的taggit tag -l
切换到某个taggit checkout tag_name
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 1234567891011 Copyright & &&版权所有

我要回帖

更多关于 怎么把几个文件打包 的文章

 

随机推荐