要备份一个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 ) );
}
}
答案 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和更少的比特来发送电线。
无论哪种方式,此方法都比使用clone
或mirror
有一些好处,因为还会备份配置文件和元文件(例如.git/config
,.git/info/exclude
,{ {1}}和reflog - 这非常有用。)