首页 > 代码库 > 备份管理多个git项目

备份管理多个git项目

当有多个git项目时应该怎么让这几个git项目都统一备份到某个文件夹中呢?

一个方法是将这些git项目每次都用cp命令拷贝到一个文件夹中,这样存在的问题是,下次备份时就麻烦了,要么删掉旧备份,要么重命名。

另一个较好的方法是用git来管理这些git项目。可是,git项目中,如果子文件夹中有.git目录,git会自动忽略。并且,备份应该是完整的备份。即每个git项目的在.gitignore中的文件也应该备份。而用git管理的话会忽略这些文件的。

所以,对于这些的处理,我写了个函数脚本来处理,见下:

# 备份管理多个git项目
function gitbackup()
{
    [ $# = 0 ] && new_cwd='.' || new_cwd=$1
    [ ! -d $new_cwd/.git ] && echo "Not a git repository!" && return 1

    suffix='lep'
    gitbackup=".gitbak.$suffix"
    old_cwd=`pwd`
    cd $new_cwd || return 1

    for dir in `ls`
    do
        if [ -d $dir/.git ]; then
            # 将项目的忽略文件也保存备份起来
            for f in `find $dir -name '.gitignore'`
            do
                mv -f $f $f.$suffix
            done
            rm -rf $dir/$gitbackup
            mv $dir/.git $dir/$gitbackup
        fi
    done

    git add -A
    git commit -m 'backup git project'
    git config push.default current
    git push

    echo 'backup git project success!'
    cd $old_cwd
    return 0
}

# 恢复备份的git项目
function gitrestore()
{
    [ $# = 0 ] && new_cwd='.' || new_cwd=$1
    [ ! -d $new_cwd/.git ] && echo "Not a git repository!" && return 1

    suffix='lep'
    gitbackup=".gitbak.$suffix"
    old_cwd=`pwd`
    cd $new_cwd || return 1

    for dir in `ls`
    do
        if [ -d $dir/$gitbackup ]; then
            mv $dir/$gitbackup $dir/.git
        fi
        # 恢复ignore文件
        for f in `find $dir -name .gitignore.$suffix`
        do
            mv -f $f `dirname $f`/.gitignore
        done
    done

    echo 'restore git project success!'
    cd $old_cwd
    return 0
}

# 备份和恢复
function gitbr()
{
    gitbackup  $1
    gitrestore $1
    return 0;
}

用法:把这三个函数加入你的.bashrc或.zshrc,然后source一下,让其生效。然后在某个目录下运行下列命令:

git init --bare git_pro_backup
git clone git_pro_backup git_pro
cd git_pro
git clone 你的git项目地址
git clone 你的其他git项目地址
...
gitbr 或 gitbr .


这样,你的git项目就都备份起来了,并且,也备份了你的git项目中被忽略的文件。

当不小心你的git项目出现问题需要恢复时,可以运行下面命令来恢复:(假设你的git_pro_backup位于/tmp下)

git clone /tmp/git_pro_backup git_pro
cd git_pro
gitrestore
这样,你的所有git项目就都恢复到上一次你运行gitbr或gitbackup时的状态了。

有任何问题回复或q我:281754179

备份管理多个git项目