2010-08-19 2 views
2

는 자식의 repo를 백업하려면이백업 git repo : 아카이브 미러 클론 ... tar -Pzcf는 어떨까요?

는/usr/빈/타르 -Pzcf git_backup.tar.gz repo.git & &는/usr? :처럼 그냥 크론를 실행할 수 없습니다 어떤 이유가있다/bin/scp git_backup.tar.gz me @ other-server :/home/backup

가장 최근의 것을 사용할 수있는 다른 모든 사본에 문제가 발생하면 원래의 장소 인 tar -xzf를 사용하여 복제, 푸시, 당기는 등? 그것이 좋아야하는 것처럼 보인다. 그러나 나는 100 % 확실하지 않다. 참고 : 저는 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 <[email protected]> 
*/ 

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} [email protected]{$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

좋은 답변 - 모두들, 그러나 git 번들 (그리고 테스트 해보기)을 들여다 보니, 지금 당장은 내 최선책 인 것 같습니다. 조금 실험 해보고 --mirror 옵션을 부차적으로 사용하겠습니다. 나는 또한 모든 것을 지금까지 타르 려하고 갈고리와 구성 물건, jik을 얻으 려합니다. – Hans

답변

2
  • 참조 백업의 주요 규칙 중 하나 : 변경하지 않고 계속 백업하십시오.
  • 하나의 사소한 규칙 : 가능한 한 적은 파일을 백업하려고 시도하십시오. 다른 곳에서는 전송이 간소화됩니다 (복사 할 파일이 거의 없음). 의 덤 git bundle (볼이 SO answer)
    : 그 두 규칙 존중

한 명령

  • 증분 백업 (프로세스 전체보다 빠르다 의미 타르).
  • 하나의 결과는입니다.

고유 한 결과 파일 (번들의)은 재사용하기 위해 압축 해제 할 필요조차 없습니다. Git repo 자체입니다.

1

내가 생각할 수있는 유일한 이유는 모든 바이너리 (및 개체 파일 ... 등 ...)의 복사본을 만드는 것입니다. 특히 원격으로 백업하려는 경우에는 저장소 만 있으면됩니다.

나라면 git-clone을 백업하는 것이 백업이 더 작고 더 빠를 것입니다.

힘내 주심은 중앙 저장소가 엉망인 경우 (가능하다면) 두통을 피할 수있는 SVN 문제가 없도록 분산 된 저장소를 갖도록 설계되었습니다.

+0

@ user424448 : 'git remote alias.bak "push --mirror ..."유형의 것을 추가 하시겠습니까? 아니면 백업 서버에 복제하여 당겨 올리시겠습니까? 감사. – Hans

+0

@Hans : 아마 push -mirror를 사용하면 약간 쉬울 지 모르지만, refs/head/* 대신에 refs에 설정된 refspec을 가져올 수도 있습니다. – Cascabel

0

예,이 작업은 정상적으로 작동합니다. 가능한 문제는 repo가 ​​변경되는 동안 cron 작업이 실행되는 경우입니다 (예 : git push 또는 commit을 통해). (네이티브 자식 명령은 항상 잠금 상태의 파일을 사용하여 잠금 상태를 유지합니다.)

실제로 더 효율적인 접근 방법은 rsync을 사용하는 것이므로 새 물건을 유선으로 보내면됩니다. 타르볼을 만드는 데 드는 비용과 공간이 필요하고 전선을 통해 전송할 비트가 적습니다.

하나의 방법은이 방법이 clone 또는 mirror를 사용을 통해 몇 가지 장점이 있습니다 설정 및 메타 파일도 백업 할 수 있기 때문에 (예를 들어, .git/config, .git/info/exclude, .git/hooks/*과 reflog - 정말 유용합니다).

+0

좋은 지적은 ... 확실히 후크를 백업하고 싶습니다. 나는 저장소의 일부가 될 것이라고 생각했지만 아마이 방법이 더 나은 것 같아. – Hans