备份git repo:归档镜像克隆... tar -Pzcf怎么样?

时间:2010-08-19 00:55:15

标签: git

要备份一个git repo,有什么理由不能像这样运行一个cron吗?:

/ usr / bin / tar -Pzcf git_backup.tar.gz repo.git&& / usr / bin / scp git_backup.tar.gz me @ other-server:/ home / backup

如果所有其他副本发生了什么事情我可以使用最新的,只有tar -xzf进入它的原始位置,克隆,推送,拉动等?似乎它应该没问题,但我不是百分百肯定。注意:我已经看到了涉及git clone或使用--mirror的其他答案,但这看起来更简单。如果答案表明它会更好,那些仍然是选择。

----------------编辑-----------------

这是我最终创建的脚本:

#!/usr/bin/php -q
<?php

/**
 * Backup git on this box and copy it around
 *
 * cron:
 * 1 2 * * * /usr/bin/php /home/sysadmin/files/shared/git_backup.php REPO 2> /dev/null
 *
 * @package scripts
 * @author Hans Anderson <handerson@>
 */

list ( $dir, )  = explode ( '/files/', __FILE__ ); require_once ( "{$dir}/files/bootstrap.php" );
$email      = $cfg['GIT_BACKUP']['email_errors_to'];
$copy_hosts = explode(',', $cfg['GIT_BACKUP']['hosts']);

if ( !isset ($argv[1]) ) exit;

$repo = $argv[1];
$date = date ( 'Y-m-d-H' );
$user = `whoami`; $user = trim($user);

$repf = "/newdisk/git/{$repo}.git";
$bndl = "/newdisk/backup/{$repo}/git/git-{$repo}-{$date}.bndl";

chdir($repf);

$exec =  "/usr/bin/git bundle create $bndl --all";
exec ( "$exec", $error, $return );

if ( $return <> 0 ) // bad
{
    mail ( $email, "{$user} GIT Backup Failure [{$repo}]!", __FILE__ . "\nFailure to dump.\nCmd: $exec\nError: $error" );
}

foreach ( $copy_hosts as $host )
{
    $exec = "/usr/bin/scp -q {$bndl} sysadmin@{$host}:/home/sysadmin/data/backup/$repo/git";
    exec ( $exec, $error, $return );

    if ( $return <> 0 )
    {
            mail ( $email, "{$user} GIT Backup Failure [{$repo}]!", __FILE__ . "\nFailure to copy to dbs1.\nCmd: $exec\nError: " . implode ( "\n", $error ) . "\n\nReturn:" .  implode ( "\n", $return ) );
    }
}

3 个答案:

答案 0 :(得分:2)

  • 参照备份的一个主要规则:永远不要备份可能仍在更改的内容。
  • 一个小规则:尝试获取尽可能少的文件进行备份;然后简化他们在其他任何地方的转移(很少要复制的文件)。

可以遵守这两条规则的一个命令: git bundle (另请参阅此SO answer
额外的奖励:

  • 增量备份(意味着该过程比完整焦油更快)。
  • 一个文件。

独特的结果文件(来自捆绑包)甚至不需要解压缩才能重复使用。它本身就是一个Git回购。

答案 1 :(得分:1)

我能想到的唯一原因是你将创建所有二进制文件(和目标文件......等)的副本。您可能只需要存储库,尤其是在您要远程备份时。

如果是我,我会以备份较小的方式进行git-clone,移动它会更快。

Git被设计为具有分布式存储库,因此您不会遇到SVN问题,如果中央存储库被搞砸了,您将很难恢复它(如果可能的话)。只需git-clone备份到处:-)

答案 2 :(得分:0)

是的,这样可以正常工作。唯一可能的问题是,如果cron作业在对repo进行更改时运行(例如,通过git push或commit)。 (本机git命令使用锁定文件来确保事物总是处于正常状态。)

事实上,一种更有效的方法是使用rsync,因此您只需通过线路发送新内容 - 无需花费成本和空间来制作tarball和更少的比特来发送电线。

无论哪种方式,此方法都比使用clonemirror有一些好处,因为还会备份配置文件和元文件(例如.git/config.git/info/exclude,{ {1}}和reflog - 这非常有用。)