git大文件管理

  由于git在commit时保存整个文件系统,如果在文件系统中有一些大的二进制文件,比如图片,视频,那么很快你的repo就将变得很大,clone这个repo时也会耗用越来越多的时间。有没有什么办法来优化这个问题呢?

  一个可行的方法是使用git-fat : https://github.com/jedbrown/git-fat

其原理是:将二进制文件本身存放于共享文件系统中,保存在git repo中的信息仅仅是一些meta数据。

1.安装: git-fat是一个shell脚本,只要下载该脚本,放到你的path变量中就安装好了

2.使用:创建一个.gitattributes文件,来描述哪些文件是一个二进制文件:

$ cd path-to-your-repository
$ cat >> .gitattributes
*.png filter=fat -crlf
*.jpg filter=fat -crlf
*.gz  filter=fat -crlf
^D

运行git fat init 激活上面的文件后缀,从此你可以像一般文件一样来git add, git commit那些.png,.gz,.jpg文件,而文件本身却保存于repo之外的地方;

如果你的文件本身保存于一个共享服务器上,你可以创建一个.gitfat文件,该文件中写入以下内容

[rsync]
remote = your.remote-host.org:/share/fat-store
sshuser = yourusername

下面是在本地保存文件的使用流程和相关命令:

$ git init repo
Initialized empty Git repository in /tmp/repo/.git/
$ cd repo
$ git fat init
$ cat > .gitfat
[rsync]
remote = localhost:/tmp/fat-store
$ mkdir -p /tmp/fat-store               # make sure the remote directory exists
$ echo ‘*.gz filter=fat -crlf‘ > .gitattributes
$ git add .gitfat .gitattributes
$ git commit -m‘Initial repository‘
[master (root-commit) eb7facb] Initial repository
 2 files changed, 3 insertions(+)
 create mode 100644 .gitattributes
 create mode 100644 .gitfat
$ curl https://nodeload.github.com/jedbrown/git-fat/tar.gz/master -o master.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  6449  100  6449    0     0   7741      0 --:--:-- --:--:-- --:--:--  9786
$ git add master.tar.gz
git-fat filter-clean: caching to /tmp/repo/.git/fat/objects/b3489819f81603b4c04e8ed134b80bace0810324
$ git commit -m‘Added master.tar.gz‘
[master b85a96f] Added master.tar.gz
git-fat filter-clean: caching to /tmp/repo/.git/fat/objects/b3489819f81603b4c04e8ed134b80bace0810324
 1 file changed, 1 insertion(+)
 create mode 100644 master.tar.gz
$ git show --pretty=oneline HEAD
918063043a6156172c2ad66478c6edd5c7df0217 Add master.tar.gz
diff --git a/master.tar.gz b/master.tar.gz
new file mode 100644
index 0000000..12f7d52
--- /dev/null
+++ b/master.tar.gz
@@ -0,0 +1 @@
+#$# git-fat 1f218834a137f7b185b498924e7a030008aee2ae
$ git fat push
Pushing to localhost:/tmp/fat-store
building file list ...
1 file to consider

sent 61 bytes  received 12 bytes  48.67 bytes/sec
total size is 6449  speedup is 88.34

上述过程完毕后,对应的二进制文件就已经保存好了,那么后面如何使用呢?

$ cd ..
$ git clone repo repo2
Cloning into ‘repo2‘...
done.
$ cd repo2
$ git fat init                          # don‘t forget
$ ls -l                                 # file is just a placeholder
total 4
-rw-r--r--  1 jed  users  53 Nov 25 22:42 master.tar.gz
$ cat master.tar.gz                     # holds the SHA1 of the file
#$# git-fat 1f218834a137f7b185b498924e7a030008aee2ae
$ git fat pull
receiving file list ...
1 file to consider
1f218834a137f7b185b498924e7a030008aee2ae
        6449 100%    6.15MB/s    0:00:00 (xfer#1, to-check=0/1)

sent 30 bytes  received 6558 bytes  4392.00 bytes/sec
total size is 6449  speedup is 0.98
Restoring 1f218834a137f7b185b498924e7a030008aee2ae -> master.tar.gz
git-fat filter-smudge: restoring from /tmp/repo2/.git/fat/objects/1f218834a137f7b185b498924e7a030008aee2ae
$ git status
git-fat filter-clean: caching to /tmp/repo2/.git/fat/objects/1f218834a137f7b185b498924e7a030008aee2ae
# On branch master
nothing to commit, working directory clean
$ ls -l                                 # recovered the full file
total 8
-rw-r--r-- 1 jed users 6449 Nov 25 17:10 master.tar.gz
时间: 2024-12-15 07:12:19

git大文件管理的相关文章

git进行文件管理

本地使用git 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add 要随时掌握工作区的状态,使用git status命令. 如果git status告诉你有文件被修改过,用git diff可以查看修改内容 推送本地到github echo "# linux_beta" >> README.md git init git add README.md git commit -m "first commit&

git 管理和存储二进制大文件

git 管理二进制文件 本文档将逐步带你体验 git 的大文件管理方式. 环境: windows10 64位 cmd git版本: git version 2.18.0.windows.1 创建到推送 创建二进制文件,修改并推送到远程. : 初始化项目 git init : 创建 100k 大小文件模拟二进制文件 和普通文本 fsutil file createnew isbin.bin 102400 cd.>text.txt : 开启 lfs 功能及文件追踪 git lfs install g

Git 系列(五):三个 Git 图形化工具

在本文里,我们来了解几个能帮你在日常工作中舒服地用上 Git 的工具. 我是在这许多漂亮界面出来之前学习的 Git,而且我的日常工作经常是基于字符界面的,所以 Git 本身自带的大部分功能已经足够我用了.在我看来,最好能理解 Git 的工作原理.不过,能有的选也不错,下面这些就是能让你不用终端就可以开始使用 Git 的一些方式. KDE Dolphin 里的 Git 我是一个 KDE 用户,如果不在 Plasma 桌面环境下,就是在 Fluxbox 的应用层.Dolphin 是一个非常优秀的文件

Git&GitHub

Git&GitHub 1.版本控制工具应该具备的功能 协同修改 多人并行不悖的修改服务器的同一个文件 数据备份 不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态 状态管理 在保存每一个版本的文件信息的时候要做到不保存重复数据,以节约存储空间提高运行效率.这方面SVN采用的是增量式管理的方式,而Git采取是文件系统快照的方式. 权限控制 对团队中参与开发的人员进行权限控制 对团队外开发贡献的代码进行审核--Gti独有 历史记录 查看修改人.修改时间.修改内容.日志信息. 将本地文件恢

简单git使用命令

Git基础 1.git init 文件管理初始化 2.git status 查看当前文件夹的状态(红色/绿色区别) 3.git add 文件名 对指定文件进行版本控制,git add . 对当前文件夹下所有文件及子目录进行版本控制. 4. git commit -m 创建提交记录 5.git log 查看提交记录 6.git reset --hard 版本号 回到某一个版本状态版本记录,如果之间没有的文件,现在增加了,如果回到以前版本,文件会丢失 7.git reflog 查看目前版本 通过gi

CentOS6.8 安装配置以svnadmin管理svn代码库

一.系统环境及说明 CentOS6.8_X64 subversion版本 1.8.15 svn是版本控制软件,虽然git大用替代它的趋势,但不可否则还有很多老用户喜欢它,及svn有一个好用的功能hooks钩子功能.后面再说这个hooks的用处. 1.准备repo $cat /etc/yum.repo.d/svn.repo [WandiscoSVN] name=Wandisco SVN Repo baseurl=http://opensource.wandisco.com/centos/$rele

mongodb的固定集合(优化效率)

mongodb固定集合(Capped Collection)和大文件管理(GridFS) Capped Collection 固定集合(Capped Collection)是性能出色的有着固定大小的集合,以LRU(Least Recently Used最近最少使用)规则和插入顺序进行age-out(老化移出)处理,自动维护集合中对象的插入顺序,在创建时要预先制定大小,如果空间用完,新添 加的对象将会取代集合中最旧的对象,永远保持最新的数据. 查看集合的状态信息 db.cot1.stats();

OSChina 周一乱弹 —— 这个需求很简单!

周一,第一次闹钟其实我是拒绝的!无奈长得漂亮,总是要早起的,听说长得丑的还在被窝里? @刘越  : 今天早上居然没起床成功,你以为是我的错,错!是我写的闹钟有BUG...Android闪光灯闹钟1.2版本登场啦,修复任何逃出闹钟的按键BUG,增加震动功能,APK文件更是瘦身到了65.2KB,哈哈哈,明日绝对起床啦 地址:http://git.oschina.net/voyageliu/FlashAlarm 牛逼闪闪的闹钟,看来 OSCer 的全勤奖都有希望了哈- 起床呼吸呼吸新鲜空气,不知道帝都

CakeDC(cakephp company)Git workflow--适合于较大团队大型项目开发

CakeDC Git workflow是一个项目开发和版本发布的工作流,在这个工作流程中开发和版本发布周期是基于几个关键阶段(key phases): Development: 所有活跃的开发活动都由里程碑驱动,在这个阶段的产出是很不稳定的代码基线 QA: Quality assurance testing作为一开发周期的一部分,主要协助确保需求的满足性和质量的可接受性 Review 客户或者评审员面对的是一个稳定的代码基线,该基线已经经过了QA流程,质量上已经被QA人员认可 Release 发