git库管理

来源:互联网 发布:信三哥的真水淘宝 编辑:程序博客网 时间:2024/04/29 21:42
$ git show-ref020e5bd6cd46bb4679d23bc9721e89f361f31e1f refs/heads/master020e5bd6cd46bb4679d23bc9721e89f361f31e1f refs/remotes/origin/HEAD020e5bd6cd46bb4679d23bc9721e89f361f31e1f refs/remotes/origin/master060a9f442b47f3c3aae206cba2a8b9795efa32f1 refs/tags/Aaf8a1c5945157cbe38c15a45ef5a78e654c10404 refs/tags/Bf94e582809f7cc05bf5e8c9950dd32ebc4ac6ac4 refs/tags/C6080809b4103c5aed109988b7610bdc135439e51 refs/tags/De869230a95bc4662b85afe6e30ac0dd89cf3e78b refs/tags/E2cbfc1b3310f5b1525c1107299c4040eb9dde508 refs/tags/F

refs/heads/开头的是分支,

refs/remotes/开头的是远程版本库分支在本地的映射,

refs/tags/开头的是里程碑

$ find .git/refs -type f.git/refs/heads/master.git/refs/remotes/origin/HEAD
$ git pack-refs --all
$ find .git/refs -type f.git/refs/remotes/origin/HEAD

本应该出现在.git/refs/目录下的引用文件被打包了,放到一个文本文件.git/packed-refs中

$ head -5 .git/packed-refs# pack-refs with: peeled fully-peeled020e5bd6cd46bb4679d23bc9721e89f361f31e1f refs/heads/master020e5bd6cd46bb4679d23bc9721e89f361f31e1f refs/remotes/origin/master060a9f442b47f3c3aae206cba2a8b9795efa32f1 refs/tags/Aaf8a1c5945157cbe38c15a45ef5a78e654c10404 refs/tags/B

再看看git对象(commit、blob、tree、tag)在对象库中的存储

$ find .git/objects/ -type f.git/objects/02/0e5bd6cd46bb4679d23bc9721e89f361f31e1f.git/objects/06/0a9f442b47f3c3aae206cba2a8b9795efa32f1.git/objects/06/425318860a9bd4f5a0a0e02977282b3af6a16e.git/objects/06/c5d27c3a11949407c878ace7a9db3b89f38cb0.git/objects/07/1b3b2503dae66933f146a37011dddc9a97c531.git/objects/07/b9980b19543e4aeff34dd616093feb1c6ee039.git/objects/07/cab98f88f471ec9820f19bb162aa44ddb92cd7


2.暂存区操作引入的临时对象

nanayin@201605050385- MINGW64 /f/gitdemo-admin (master)$ cp f:/CRT.zip bigfilenanayin@201605050385- MINGW64 /f/gitdemo-admin (master)$ cp f:/CRT.zip bigfile.dup

将工作区中两个大文件加入到暂存区

$ git add bigfile bigfile.dup


查看一下磁盘空间占用

工作区连同版本库共占用115M

$ du -sh115M 

其中版本库占用38M

$ du -sh .git/38M     .git/


如果不想提交,想讲文件撤出暂存区
1.查看当前暂存区的状态

$ git status -sA  bigfileA  bigfile.dup

2.将添加的文件撤出暂存区

$ git reset HEAD


3.查看状态,文件被撤出暂存区了

$ git status -s?? bigfile?? bigfile.dup

文件撤出暂存区了,在对象库中产生的blob松散对象仍然存在,通过查看版本库的磁盘占用就可以看出来

$ du -sh .git/38M     .git/


git提供git fsck命令,可以查看到版本库中包含的没有被任何引用关联的松散对象

$ git fsckChecking object directories: 100% (256/256), done.dangling commit 2642edfaf976516cf23e44e622f4299da993a262dangling blob 7ef010914d0f33cac6948c4492172b6b5b395293dangling commit 97e6838201fe78c86b66135a881e86a12f7ba6a1dangling commit a9904c21b08cb8e043068a0457baccab29f0367adangling tag c972a74532c1ef9827473139b0fc8550eb74ee02dangling commit e2609ca3ef63827bdff7972ba894dc5a000964a6dangling commit 071b3b2503dae66933f146a37011dddc9a97c531dangling commit 35093fbb70f294e43bcb584f48d0d2a1117f72f1dangling commit 5883cddb3b5d8f5a88aec7eb1ce1ff616a9606e4dangling commit 655585e59d659258aebe88c3af39a72d6cb92d5ddangling commit 7d81b62df13b2a5d46bf38361a20373ee552ee8adangling commit 7e1b59e5d3fb2639878185c0694241ff01f7ea85dangling commit 89a786a39397ff8cc9faed23ea1b592c91d8ca85dangling tag 8fa1507645a45342db14e9096a11273d4b5d6082dangling commit a0fd9c8a0037566e2bed9410aef754e4578549efdangling commit a1630be0736079af615485d23766bf2d81896db5dangling commit aae78ddcf8b8d34a251c21841561cf8a4fbd9678dangling commit b6dbdca7cffb5055bcc4facb2108a4ae77d41e1ddangling commit bd05a0bdb88cf7eb4c10b084ada2121990561097dangling blob ce013625030ba8dba906f756967f9e9ca394464adangling blob d53bf182d64ca3a1f853015ec2f2090307245fb8dangling commit e0ab3913fd8ea84e7c397a38996a213feee31e34dangling commit e86bbeb80bc3058dd23b6ef4649fda66b85b5763dangling commit e8d1cc7f28d419da395bcefa424c13cdf4971fa5dangling blob f6e56b4f49781901b9c59d526304eba4e7b0ee3cdangling commit fbd915bd3b2076ca63cfcde92f8bebda98bec767

标记为dangling的对象就是没有被任何引用直接或者间接关联到的对象,

这个对象就是前面通过暂存区操作引入的大文件的内容。

将这些无用的文件从版本库中彻底删除

$ git prune
$ git fsckChecking object directories: 100% (256/256), done.
$ du -sh .git/165K    .git/


3.重置操作引入的对象

$ git status -s?? bigfile?? bigfile.dup
$ git add bigfile bigfile.dup
$ git commit -m "add bigfile..."[master b609098] add bigfile... 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 bigfile create mode 100644 bigfile.dup
$ du -sh .git/38M     .git/

做一个重置操作,抛弃刚刚针对俩个文件做的提交
$ git reset --hard HEAD^HEAD is now at 020e5bd sync test 6


重置之后,版本库的空间占用没有变化
$ du -sh .git/38M     .git/

查看对象库
$ find .git/objects/ -type f.git/objects/02/0e5bd6cd46bb4679d23bc9721e89f361f31e1f.git/objects/06/0a9f442b47f3c3aae206cba2a8b9795efa32f1.git/objects/06/425318860a9bd4f5a0a0e02977282b3af6a16e.git/objects/06/c5d27c3a11949407c878ace7a9db3b89f38cb0.git/objects/07/b9980b19543e4aeff34dd616093feb1c6ee039.git/objects/07/cab98f88f471ec9820f19bb162aa44ddb92cd7.git/objects/07/ec8c0d8cbc786902a1bf75110bbd65faf039e4.git/objects/0b/be6a311084c056d1487300d3d18104fae81daa.git/objects/0c/30d3eefbb2e1e59a1d612b25bbe6ee58478b9c.git/objects/0e/36841a956fee58881a8777b6ddba960e6a9aee.git/objects/0f/b206894700fd1d2a0c9ced07ccc390cf69ae18.git/objects/0f/ce0b3b35f9c2ea35be1ef87f23de44a6eded95.git/objects/11/82f2ece0c772ac7b3cf4836e3f0b6781e462c6.git/objects/13/4d8b0514eb3ca9af154446ba1e52943b9a033c.git/objects/19/d2c13bd1eaa3e1c8319142fd6daaf6d0f29c52.git/objects/19/de28c04b08a30f8d814ab28d4b431efaf0951f.git/objects/1b/9d4f622520853d6a577ead15c32daac7c96c0e.git/objects/25/3db52d032c2e1546d41388b482d4bb422f53d8.git/objects/26/8afa36b9b348228fd2fc77b12423d9e97d710b.git/objects/2c/5da855ffec0ae6d67cbf6812fd8278f3e6fc1d.git/objects/2c/bfc1b3310f5b1525c1107299c4040eb9dde508.git/objects/2f/440402864b331c9f4e75e0cb21f513d12cac45.git/objects/30/6b97b5dc629cb428d664c50f31f7815ad370f0.git/objects/34/3b2b6b354bd687b3b0020ac54cf6ef78f4b0cb.git/objects/39/a90e00195c8cc4b55af3b1e106142fd3deaf80.git/objects/3b/0e9821f0047b999f0155c410dbef0b93b2ec3b.git/objects/3c/490b53686d4e0a9a941c9663e42c20b1b2ba85.git/objects/3d/5e2cbfbb3db32816405c1159bba27db57733e0.git/objects/3f/235edbefc2f5ad81154fd22bb92dc296ac86bf.git/objects/40/bcec0a770bd26e350adbb36c2db58d669ed19f.git/objects/41/07309c36f552500f479c85b5cd313d114589d8.git/objects/42/4e6d8281110ed08a05991833376e662d80e229.git/objects/45/ad43e40b1c76bc08f36d1d31ab08562b54652d.git/objects/49/2478d7ebc1e6bc7104e585c6fe2b38185521c3.git/objects/49/9aaab5309f6252885c16b1f76422da3375717b.git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904.git/objects/4c/79be14a76b90abf5f99790565153dd0c377413.git/objects/52/821857320d5b5de2865b72d5f4827b07fb8e54.git/objects/53/a931c81486228d6989eda29609e1ac87743631.git/objects/58/c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c.git/objects/60/67962c4ce3c3e71621cbd39d670dd84be2a0cc.git/objects/60/80809b4103c5aed109988b7610bdc135439e51.git/objects/62/e5a6a9ad9cdbcc5907068a2c3d1db64a1bb824.git/objects/63/1d7aa16079dee4c77acd237ce0775071026cc2.git/objects/63/335a198552e72e7f4a59a265769c96df0e57d3.git/objects/65/7ad52f6135c32594e8078cab06b4c6a7ccf562.git/objects/66/385072cc5352257e07fdc84923a3b367f6416c.git/objects/66/a5a9b3a6d287b61314f1a03126e815a2714ca9.git/objects/66/c420df58dde033bb6fd1afa7bb89d1c1d42bf7.git/objects/67/a25cff64e2a4380687933d62d1a093ad377d9e.git/objects/6d/9eb11513bcd9109814459cd2c213673772742c.git/objects/74/92026faf37f5cc7414cf1579add2a5666e3405.git/objects/75/3ff4fa00715c7e300a26155cc7c3d1b4c6a4f7.git/objects/77/db5e5bbd86756656bc4cd6ac1e59ab4695e27f.git/objects/7d/bbceab4b80697b093d08ef8b52a69dd4c35c37.git/objects/7e/b23fd3760e1b76bd1944ec6568ae08422fbf76.git/objects/80/0e539bd0511f067d00a7f21ce284dcc4dcaafd.git/objects/81/703bed1ee4a3072a614dcb5e9e5f499e2c2873.git/objects/8a/1d4a8b6de2002c8df292bae980d07b89d149eb.git/objects/8c/c0e9dc4f6ea6fd409544212cc13b9ff57e1dd9.git/objects/90/3cccd036a8e0c7060476dbd5daa7b314c4dbb6.git/objects/92/d0322dfc099d5ef64423c61fb376fca4246285.git/objects/93/4bcac052256cf82a1f9eb3927a4aba770387b9.git/objects/94/d474f213e3c8d7adcc8b3fd69d23d971e55ad5.git/objects/99/fc26c7eb14cac8432ce38259bd65ca36b07391.git/objects/9a/a379924b5aab68d0b290c20d729ec7735d2d04.git/objects/a1/158c1237d9baa1a72bec50219ff14c95fcb6e2.git/objects/a8/0700dda61c4f102892b05ed23db3d00f992302.git/objects/aa/babbf5c237262663146cc7335710e749ba6cdc.git/objects/af/8a1c5945157cbe38c15a45ef5a78e654c10404.git/objects/b0/c78e64caa337d0e7b25f92fcc0b6cc368dc278.git/objects/b6/09098278c5048f6b109e761cbbad5495a4449b.git/objects/b6/e2840be927f3088d3685deca79f15bd2007209.git/objects/b7/230aae2a45f3dbcac9ea93788828b3d4e343e3.git/objects/c2/1afcd1d31c46b8d87a9735f0c3cab9cd9549d0.git/objects/c2/dfb848baffeb848a63162ad28489f06cbedb03.git/objects/c7/656b50672bac016eac7f967ee1a476c02d21aa.git/objects/c9/c680fb9692fccf6e2b1fed476ba8dee96c6ad4.git/objects/cb/8c113867915e0774c91d4bb3d60f3c870d0fb3.git/objects/cc/b2e4a94d562b1effee6916abfc4a34c3d8e47c.git/objects/cc/e95fce00d527138004979538699f42bd440030.git/objects/d5/3bf182d64ca3a1f853015ec2f2090307245fb8.git/objects/dd/e26e0f588797024e7ef1b85d114b0f26705d71.git/objects/df/33bea3141db42c47dfb8fc2ce1d1d9416100e2.git/objects/df/5c8cb11be555d483fb2a575eb0aa09570d68e6.git/objects/df/69eb991294825b467ca423d38aedd4117ca0f1.git/objects/e2/cf059500c58d8fe39dd19142cf44d7bc1c7544.git/objects/e3/dbb294875dd9f7664af3b52e555851b1d48797.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391.git/objects/e7/89617db2f442ba53526a3c80e9f7c099468554.git/objects/e8/69230a95bc4662b85afe6e30ac0dd89cf3e78b.git/objects/e8/6fe8348c3b5cb745c54f5dd96642120c7eb76e.git/objects/f7/b0e74916729417a5f2938161512ee2add5faf6.git/objects/f8/24e6b2d17f64bd1ad9585daba6b41591fdba89.git/objects/f9/4e582809f7cc05bf5e8c9950dd32ebc4ac6ac4.git/objects/fc/d7dabbc9c1e4b2c555857d683ec2393e0a322f.git/objects/fe/ce0beb413478122dbe4e2dcbb38469d51cee55.git/objects/ff/4f83a7a38e1a0218695d038a62ed8d03bfef97

$ git fsck --no-reflogsChecking object directories: 100% (256/256), done.dangling commit b609098278c5048f6b109e761cbbad5495a4449b

$ git reflog020e5bd HEAD@{0}: reset: moving to HEAD^b609098 HEAD@{1}: commit: add bigfile...020e5bd HEAD@{2}: clone: from f:/gitdemo
可以看到撤销的操作仍然记录在reflog中,git认为撤销的提交和大文件都可以被追踪到,还在使用着,所以无法使用git prune
如果确认真的要丢弃不想要的对象,需要对版本库的reflog做过期操作,相当于将.git/logs/下的文件清空,
使用如下的reflog过期命令做不到让刚刚撤销的提交过期,因为默认90天前的数据过期
$ git reflog expire --all
$ git reflog020e5bd HEAD@{0}: reset: moving to HEAD^b609098 HEAD@{1}: commit: add bigfile...020e5bd HEAD@{2}: clone: from f:/gitdemo

需要为git reflog命令提供 --expire=<date>参数,强制让<date>之前的记录全部过期
$ git reflog expire --expire=now --all
$ git reflog

使用now作为时间操作,让reflog的全部记录都过期
没有了reflog,即从reflog中看不到回滚的添加大文件的提交后,该提交对应的commit对象、 tree对象、 blob对象就会成为未被关联的dangling对象,可以用git prune清理
$ git prune
$ du -sh .git/164K    .git/

4.git管家:git-gc

前面介绍的是比较极端的情况,实际操作中很少用到git prune命令清理版本库,
而是会用一个更为常用的命令 git gc,会版本库进行一系列的优化动作:
1.对分散在.git/refs下的文件进行打包 到文件.git/packed-refs中
如果没有将配置gc.packrefs关闭,就会执行命令:git pack-refs --all --prune实现对引用的打包
2.丢弃90天前的reflog记录
会运行reflog过期命令:git reflog expire --all
因为采用了默认参数调用,因此只会清空reflog中90天前的记录
3.对松散对象进行打包
运行git repack命令, 凡事有引用关联的对象都被打在包里,未被关联的对象仍旧以松散对象的形式保存
4.清除未被关联的对象,默认只会清除2周以前的未被关联的对象
可以向git gc提供--prune=<date>,其中的时间参数传递给git prune --expire<date>,实现对指定日期之前的未被关联的松散对象进行清理
5.其他清理
如运行git rerere gc对合并冲突的历史记录进行过期操作
$ cp f:/CRT.zip haha
$ cp f:/CRT.zip haha.dup
$ echo "hello world" >>haha.dup


将这两个稍有不同的文件提交到版本库

$ git add haha haha.dup
$ git commit -m "add haha...."[master 0fce1d6] add haha.... 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 haha create mode 100644 haha.dup

可以看到版本库中提交进来的两个不同的文件是不同的对象
$ git ls-tree HEAD | grep haha100644 blob d53bf182d64ca3a1f853015ec2f2090307245fb8    haha100644 blob eb767841ccf68cea74a748a76153ac2054ad9879    haha.dup


做版本从重置,抛弃最新的提交,即抛弃添加两个大文件的提交
$ git reset --hard HEAD^^HEAD is now at 53a931c sync test 5

$ du -sh .git/75M     .git/
版本库空间扩大一倍,因为这两个大文件分开存储造成的



























0 0
原创粉丝点击