用 Git 备份文件夹

                     

贡献者: addis

  • 本文处于草稿阶段。
预备知识 Git 笔记

   以下 bash 程序可以把若干个文件夹中的每个都用 git 备份到 备份目录。运行完后,每个 文件夹* 会保存为 备份目录/文件夹*.git。这个其实就是 git 仓库中的 .git 文件夹(注意并不是 bare repo,不可以用于上游)。

   要注意的是,Git(尤其是 Windows 上)处理大的二进制文件的速度较慢。笔者在 Windows 上在两个 HDD 硬盘之间用该脚本备份,写入速度平均 12MiB/s。但笔者认为 Git 的丰富功能和灵活性、以及广泛的普及可以弥补这一不足。另见 bup(待研究)、git-annex(最新版本依赖于 symlink)以及 git-lfs(没有本地 repo)。更简单直接地,可以用 rsync 甚至 cp 备份

   备份脚本:用法 git-backup.sh 备份目录。所有子目录中,如果包含 .gitattributes,就会备份到 备份目录/子目录名.git(相当于正常使用 git 时的 备份目录/.git 文件夹)。

代码 1:git-backup.sh
#! /bin/bash

if (($# != 1)); then
  echo "error: must specify a dest path!" 1>&2
  exit
fi

dest="$1" # backup directory

for repo in */ ; do
  repo=${repo%/}
  if ! [ -f "$repo/.gitattributes" ]; then
    continue;
  fi

  printf "\n\n\n===============================\n"
  echo "$repo"
  printf "===============================\n\n\n"
  if ! [ -d "$repo" ]; then
    echo "error: directory not found!"
    continue
  fi
  gitdir="${dest}${repo}.git"
  dirflag="--work-tree=$repo --git-dir=$gitdir"
  echo "mkdir $gitdir ..."
  mkdir -p "$gitdir" &&
  echo "git init ..." &&
  git $dirflag init &&
  echo "git add -A ..." &&
  git $dirflag add -A --verbose &&
  # 其他有用的命令:
  echo "git commit ..."
  git $dirflag commit -m 'update'
  # echo "git status ..."
  # git $dirflag status
  # echo "git gc"
  # git $dirflag gc
done

  

未完成:如何批量检查变化?批量 commit?push?多重备份?

                     

© 小时科技 保留一切权利