备份git repo:存档镜像克隆。。。那焦油Pzcf呢?

备份git repo:存档镜像克隆。。。那焦油Pzcf呢?,git,Git,为了支持git回购,有什么理由我不能像这样运行cron吗 /usr/bin/tar-Pzcf git_backup.tar.gz repo.git&&/usr/bin/scp git_backup.tar.gzme@other-服务器:/home/备份 如果所有其他副本都发生了问题,我可以使用最新的tar-xzf将其复制到原始位置,克隆、推、拉等?看起来应该没问题,但我不是100%确定。注意:我见过其他涉及git克隆或使用--mirror的答案,但这似乎更简单。如果答案表明会更好,这些仍然是选项

为了支持git回购,有什么理由我不能像这样运行cron吗

/usr/bin/tar-Pzcf git_backup.tar.gz repo.git&&/usr/bin/scp git_backup.tar.gzme@other-服务器:/home/备份

如果所有其他副本都发生了问题,我可以使用最新的tar-xzf将其复制到原始位置,克隆、推、拉等?看起来应该没问题,但我不是100%确定。注意:我见过其他涉及git克隆或使用--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 ) );
    }
}
#/usr/bin/php-q

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

如果是我,我会做git克隆,这样备份会更小,移动速度也会更快


Git被设计成具有分布式回购协议,这样您就不会出现SVN问题,如果中央回购协议出现问题,您就很难恢复它(如果可能的话)。到处都是git clone备份:-)

是的,这样就可以了。唯一可能的问题是,如果cron作业在对repo进行更改时运行(例如,通过git推送或提交)。(本机git命令使用锁文件确保始终处于正常状态。)

事实上,一种更有效的方法是使用
rsync
,这样你只需通过电线发送新的东西——不需要制作柏油球的成本和空间,也不需要通过电线发送更少的比特

无论哪种方式,这种方法都比使用
clone
mirror
有一些好处,因为配置文件和元文件也将被备份(例如,
.git/config
.git/info/exclude
.git/hooks/*
和reflog,这非常有用)。

  • 引用备份的一个主要规则是:当某些内容可能仍在更改时,不要备份它
  • 一个小规则是:尽量少的备份文件;然后,它们在其他任何地方的传输都会简化(要复制的文件很少)
一个可以遵守这两条规则的命令:(另请参见此)
额外的奖金是:

  • 增量备份(意味着该过程比完整的tar更快)
  • 结果只有一个文件

唯一的结果文件(来自捆绑包)甚至不需要解压缩即可重用。它本身就是一个Git repo。

@user424448:你是说“Git remote add alias.bak”push--mirror…“在备份服务器上键入内容还是克隆并拉取?谢谢。@Hans:推--mirror可能会稍微容易一些,但是你也可以用refspec设置为refs/*而不是refs/heads/*-来获取,只要你得到了所有东西。答案不错--都是,但是看看git包(并测试它),这似乎是我现在最好的选择。我将对它进行一点实验,然后再使用镜像选项。我也会时不时地把它涂上焦油,以获得钩子和配置的东西,jik。很好的观点。。。我一定要把钩子倒回去。我想我认为这将是存储库的一部分,但我想这样可能更好。