バックアップツールとしてのGIT


101

サーバーにgitをインストールします

cd /
git init
git add .
git commit -a -m "Yes, this is server"

次に/.git/、ネットワークドライブ(SAN、NFS、Sambaなど)または別のディスクを指すようにします。変更を更新するために、1時間/日などごとにcronジョブを使用します。.gitディレクトリには、すべてのサーバーファイルのバージョン管理されたコピーが含まれます(/ proc、/ devなどのような役に立たない/複雑なファイルを除く)。

適切なバックアップシステムに設定する手間やコストが不要で、バックアップが便利なだけの場合(つまり、このサーバーをバックアップする必要ありません、何か問題が発生した場合)、これは有効なバックアップソリューションである可能性がありますか、それともうんちの大きな山に落ちますか?


3
同様のアイデアを使用してスパークルシェアしませんか?
B14D3

@ B14D3 sparkleshareは一種のドロップボックス型のものだと思いますが、詳しく調べます
11

2
あなたは正しいですが、gitを使用して何らかの種類のバックアップを作成します(複数のPCにコピーし、ファイルのバージョンを制御します);)
B14D3

これに関する大きな問題は、中央制御がないことです。あらゆる形式の保守またはバックアップ検証を実行するには、マシンに直接(ssh)アクセスする必要があります。バックアップするボックスにアプリをインストールすると、中央の場所からアプリを管理できるのがはるかに大きなメリットです。
hafichuk

@hafichuk Puppet / Chefのようなツールでは、それほど大きな問題ではありませんが、私はあなたの主張を理解しています。
汚れ

回答:


88

あなたは愚かな人ではありません。gitバックアップメカニズムとして使用することは魅力的です。また、他の人が言ったことにもかかわらずgit、バイナリファイルでも問題なく動作します。このトピックの詳細については、Git Bookのこのページをお読みください。基本的に、gitデルタストレージメカニズムを使用していないため、ファイルがどのように見えるはあまり気にしません(ただし、git diffストック構成のバイナリファイルのユーティリティはかなり低いです)。

gitバックアップに使用する際の最大の問題は、ほとんどのファイルシステムのメタデータが保持されないことです。特に、git記録しません:

  • ファイルグループ
  • ファイル所有者
  • ファイル許可(「この実行可能ファイル」以外)
  • 拡張属性

これを解決するには、この情報をリポジトリに明示的に記録するツールを作成しますが、これを正しく行うのは難しい場合があります。

gitバックアップメタデータの Google検索では、読む価値があると思われる多数の結果が得られます(ここで取り上げた問題をすでに補正しようとするいくつかのツールを含む)。

etckeeper/etc、これらの問題の多くをバックアップして解決するために開発されました。


16
ACL /許可に言及するための+1
ラリーシルバーマン

23
Gitは空のディレクトリも保存しません。
フリム

また、履歴を介してファイルの移動/名前変更を追跡するのも面倒です。
クレゴックス

1
gitはバイナリファイルをあまりうまく処理できないため、git annexを調べることもできます。ただし、gitの概念は多少変わります。
ウーターヴェルヘルスト

1
私の意見は、バックアップデータにgitのを使用することができるということですが、サーバ全体ではない
EKanadily

21

使用していませんが、gitに基づくバックアップツールであるbupを見ることができます。


前に
バップを

1
私は最近、ハードドライブがクラッシュする数日前にbupを使い始めました;)復元がうまくいったので、お勧めします!
アンドレパラメス

1
@AndréParamésだから、あなたが言っていることは、インストールした直後にハードドライブがクラッシュしたことです... mmmmhh ... :)冗談
hofnarwillie

12

有効なバックアップソリューションになる可能性があり、etckeeperはこの考えに基づいています。ただし、.gitディレクトリのアクセス許可に/etc/shadow注意してください.git。そうしないと、プッシュがディレクトリで読み取り可能になります。


11

技術的にはこれを行うことができますが、それには2つの警告があります。

1、バイナリデータにソースバージョン管理システムを使用しています。したがって、設計されていないものに使用しています。

2、新しいマシンを構築するプロセス(ドキュメントまたは自動化)がない場合、開発プロセスが心配です。もしバスを買ったら、誰が何をすべきか、何が重要かを知っているでしょうか?

災害復旧は重要ですが、すべてをバックアップするよりも、新しい開発ボックスのセットアップを自動化(スクリプト)する方が適切です。スクリプト/ドキュメントにはgitを使用しますが、コンピューター上のすべてのファイルには使用しません。


4
開発ボックスはすべてKickStartファイルから取得され、実際には平均ボックスは再構築されるまで約2〜3か月続きます。しかし、人々は構成を変更し、物事を行い、ボックスを再構築し、人々は「ねえ、ソース管理に入れなかったが、そのボックスに何かたわごとがあったことを知っている」と言います。すべての周り、良い時間。バイナリデータは非常に厄介なものになります。シャワーを浴びている間、それは完全に見落としていました。
汚れ

基本的な原則に従わない人々に対するあなたの態度を称賛します。個人的に私はあなたに似た状況を持っていますが、私はすべてをキャッチするのではなく、重要かもしれないすべての設定ファイルにリンクするgitリポジトリを持っています。さらに、セットアップ手順が記載されたtxtドキュメント。
フィルハネン

1
gitはバイナリファイルに対して非常にうまく機能すると思います。レポのGoogle Androidの大部分は、ビルド済みの実行可能ファイルのgitリポジトリです。
user377178

6

私はgitをWindowsシステムのバックアップとして使用していますが、非常に便利です。投稿の最後に、Windowsシステムで構成するために使用するスクリプトを示します。gitをシステムのバックアップとして使用すると、2つの大きな利点があります。

  1. 多くの場合、独自の独自形式を使用する商用ソリューションとは異なり、バックアップは広くサポートされ、十分に文書化されたオープンソース形式です。これにより、データを完全に制御できます。どのファイルがいつ変更されたかを確認するのは非常に簡単です。履歴を切り捨てる場合は、同様に行うことができます。あなたの歴史から何かを消したいですか?問題ない。ファイルのバージョンを取得するのは、gitコマンドと同じくらい簡単です。
  2. 必要な数のミラーを必要なだけ、またはすべてのミラーで、バックアップ時間をカスタマイズできます。低速のインターネットトラフィックの影響を受けないローカルミラーを取得します。これにより、(1)1日を通してより頻繁なバックアップを実行でき、(2)迅速な復元時間を実現できます。(頻繁にバックアップするのは大きなプラスです。なぜなら、ドキュメントを失うのはユーザーエラーが最も多いからです。たとえば、子供が誤って過去5時間作業中のドキュメントを上書きしてしまうなどです。)リモートミラー。ローカルの災害または盗難の場合にデータ保護の利点を提供します。また、インターネット帯域幅を節約するために、カスタマイズした時間にリモートミラーをバックアップしたいとしますか?問題ない。

結論:gitバックアップを使用すると、バックアップの実行方法を非常に強力に制御できます。

Windowsシステムでこれを構成しました。最初のステップは、すべてのローカルデータをコミットするローカルgitリポジトリを作成することです。ローカルの2台目のハードドライブを使用することをお勧めしますが、同じハードドライブを使用しても問題はありません(ただし、これをリモートのどこかにプッシュするか、ハードドライブが故障した場合はネジ止めすることが予想されます)。

最初にcygwin(rsyncを使用)をインストールし、Windows用のgitもインストールする必要があります:http : //git-scm.com/download/win

次に、ローカルgitリポジトリを作成します(一度だけ実行します):

init-repo.bat:

@echo off
REM SCRIPT PURPOSE: CREATE YOUR LOCAL GIT-REPO (RUN ONLY ONCE)

REM Set where the git repository will be stored
SET GBKUP_LOCAL_MIRROR_HOME=E:\backup\mirror


REM Create the backup git repo. 
SET GIT_PARAMS=--git-dir=%GBKUP_LOCAL_MIRROR_HOME%\.git --work-tree=%GBKUP_LOCAL_MIRROR_HOME% 
mkdir %GBKUP_LOCAL_MIRROR_HOME%
git %GIT_PARAMS% init
git %GIT_PARAMS% config core.autocrlf false
git %GIT_PARAMS% config core.ignorecase false 
git %GIT_PARAMS% config core.fileMode false
git %GIT_PARAMS% config user.email backup@yourComputerName
git %GIT_PARAMS% config user.name backup

REM add a remote to the git repo.  Make sure you have set myRemoteServer in ~/.ssh/config   
REM The path on the remote server will vary.  Our remote server is a Windows machine running cygwin+ssh.  
REM For better security, you could install gitolite on the remote server, and forbid any non-fast-forward merges, and thus stop a malicious user from overwriting your backups.
git %GIT_PARAMS% remote add origin myRemoteServer:/cygdrive/c/backup/yourComputerName.git

REM treat all files as binary; so you don't have to worry about autocrlf changing your line endings
SET ATTRIBUTES_FILE=%GBKUP_LOCAL_MIRROR_HOME%\.git\info\attributes
echo.>> %ATTRIBUTES_FILE% 
echo *.gbkuptest text>> %ATTRIBUTES_FILE% 
echo * binary>> %ATTRIBUTES_FILE% 
REM compression is often a waste of time with binary files
echo * -delta>> %ATTRIBUTES_FILE% 
REM You may need to get rid of windows new lines. We use cygwin's tool
C:\cygwin64\bin\dos2unix %ATTRIBUTES_FILE%

次に、Windowsスケジューラによって定期的に呼び出されるバックアップスクリプトラッパーがあります。

gbackup.vbs:

' A simple vbs wrapper to run your bat file in the background
Set oShell = CreateObject ("Wscript.Shell") 
Dim strArgs
strArgs = "cmd /c C:\opt\gbackup\gbackup.bat"
oShell.Run strArgs, 0, false

次に、ラッパーが呼び出すバックアップスクリプト自体があります。

gbackup.bat:

    @echo off

REM Set where the git repository will be stored
SET GBKUP_LOCAL_MIRROR_HOME=E:\backup\mirror
REM the user which runs the scheduler
SET GBKUP_RUN_AS_USER=yourWindowsUserName
REM exclude file
SET GBKUP_EXCLUDE_FILE=/cygdrive/c/opt/gbackup/exclude-from.txt

SET GBKUP_TMP_GIT_DIR_NAME=git-renamed
for /f "delims=" %%i in ('C:\cygwin64\bin\cygpath %GBKUP_LOCAL_MIRROR_HOME%') do set GBKUP_LOCAL_MIRROR_CYGWIN=%%i

REM rename any .git directories as they were (see below command)
for /r %GBKUP_LOCAL_MIRROR_HOME% %%i in (%GBKUP_TMP_GIT_DIR_NAME%) do ren "%%i" ".git" 2> nul

SET RSYNC_CMD_BASE=C:\cygwin64\bin\rsync -ahv --progress --delete --exclude-from %GBKUP_EXCLUDE_FILE%

REM rsync all needed directories to local mirror
%RSYNC_CMD_BASE% /cygdrive/c/dev %GBKUP_LOCAL_MIRROR_CYGWIN%
%RSYNC_CMD_BASE% /cygdrive/c/Users/asmith %GBKUP_LOCAL_MIRROR_CYGWIN%
%RSYNC_CMD_BASE% /cygdrive/c/Users/bsmith %GBKUP_LOCAL_MIRROR_CYGWIN%

cacls %GBKUP_LOCAL_MIRROR_HOME% /t /e /p  %GBKUP_RUN_AS_USER%:f

REM rename any .git directories as git will ignore the entire directory, except the main one
for /r %GBKUP_LOCAL_MIRROR_HOME% %%i in (.git) do ren "%%i" "%GBKUP_TMP_GIT_DIR_NAME%" 2> nul
ren %GBKUP_LOCAL_MIRROR_HOME%\%GBKUP_TMP_GIT_DIR_NAME% .git

REM finally commit to git
SET GIT_PARAMS=--git-dir=%GBKUP_LOCAL_MIRROR_HOME%\.git --work-tree=%GBKUP_LOCAL_MIRROR_HOME% 
SET BKUP_LOG_FILE=%TMP%\git-backup.log
SET TO_LOG=1^>^> %BKUP_LOG_FILE% 2^>^&1
echo ===========================BACKUP START=========================== %TO_LOG%
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a%%b)
echo %mydate%_%mytime% %TO_LOG%
echo updating git index, committing, and then pushing to remote %TO_LOG%
REM Caution: The --ignore-errors directive tells git to continue even if it can't access a file.
git %GIT_PARAMS% add -Av --ignore-errors %TO_LOG%
git %GIT_PARAMS% commit -m "backup" %TO_LOG%
git %GIT_PARAMS% push -vv --progress origin master %TO_LOG%
echo ===========================BACKUP END=========================== %TO_LOG%

exclude-from.txtファイルには、無視するすべてのファイルが含まれています。

exclude-from.txt:

target/
logs/
AppData/
Downloads/
trash/
temp/
.idea/
.m2/
.IntelliJIdea14/
OLD/
Searches/
Videos/
NTUSER.DAT*
ntuser.dat*

リモートリポジトリに移動して、それらに対して 'git init --bare'を実行する必要があります。バックアップスクリプトを実行して、スクリプトをテストできます。すべてが機能していると仮定して、Windowsスケジューラに移動し、1時間ごとのバックアップをvbsファイルに向けます。その後、1時間ごとにコンピューターのgit履歴があります。それは非常に便利です-誤ってテキストのセクションを誤って削除して見逃してしまいますか?gitリポジトリを確認してください。


好奇心が強い-NetDriveやExpandriveによってエミュレートされるような低速または非標準のネットワークドライブでも動作しますか?これらのネットワークドライブでは、ほとんどのバックアップソフトウェアが失敗します。また、バックアップ内のすべてのファイルをリストし、個々のファイルを抽出したい場合は、非常に遅くなり、タイムアウトする傾向があります。gitはこれらの問題を解決できますか?
-JustAMartin

@JustAMartinネットワークドライブでテストしたことがないので、言えません。gitリポジトリでファイルを取得すると、gitは非常に効率的です。
user64141

4

まあそれは悪い考えではありませんが、私は2つの赤い旗が上がると思います:

  • ハードディスクに障害が発生した場合、別のサーバー/ドライブにコミットをプッシュしないと、すべてが失われます。(イベントの予定があれば、言及することをお勧めします。)

...しかし、それでも破損に関連するものの良いバックアップになります。または、あなたが言ったように、.git /フォルダーが別の場所にある場合。

  • このバックアップのサイズは常に増加します。デフォルトでは、プルーニングや回転などはありません。

...したがって、cronjobにタグを追加するように指示し、タグのないコミットがクリーンアップされるようにする必要があります。


おそらく古典的なものrm -Rf /が私たちにいくつかの問題を引き起こすだろうが、リモートサーバー上の.gitディレクトリをマウントするでしょう。現在のバックアップシステムは、2年間または50バージョン(どちらか最後に来た方)のものを保持するため、バックアップは常に増加しています。しかし、タグを追加するというアイデアが好きです。「毎日」、「毎週」などのタグを付けることができます
11

増え続けるスペース要件に対して+1
hafichuk

@sam gitは増え続けています。N年より古い履歴を削除することはできません。あなたの現在のシステムはそうだと思います。
RDS

1
サイズの増加については、定期的に、または別の(中央の)サーバーにプッシュする前に「git gc」を実行してください。これがないと、gitリポジトリは本来よりも(はるかに)大きくなる可能性があります。16 MBに縮小できる346 MBのgitリポジトリがありました。
ヘンディイラワン

3

完全なシステムで試したことはありませんが、MySQLのバックアップに(--skip-extended-insertオプションを使用して)使用しており、本当にうまく機能しています。

バイナリデータファイル(その内容全体が変更される可能性があります)で問題が発生し、.gitフォルダーが非常に大きくなる問題が発生する可能性があります。.gitignoreファイルを設定し、本当に必要なことがわかっているテキストファイルのみをバックアップすることをお勧めします。


--extended-insert = falseを使用して、MySQLバックアップにも使用しています。定期的に、またはコミット直後に「git gc」を実行してください。
ヘンディイラワン


3

Subversionに基づいたバックアップソリューションを開発したことがあります。それは非常にうまく機能しましたが(そしてgitはさらに良く機能するはずです)、ここにはもっと良い解決策があると思います。

私はrsnapshotがより良いものの1つであると考えます-そうでない場合より良いです。ハードリンクを上手に使用して、300 GBのファイルサーバー(50万ファイル)を持ち、毎日、毎週、毎月のバックアップを1年まで遡ります。使用済みディスク領域の合計は、1つの完全コピー+各バックアップの増分部分のみですが、ハードリンクのおかげで、各バックアップに完全な「ライブ」ディレクトリ構造があります。つまり、ファイルは、daily.0(最新のバックアップ)だけでなく、daily.1(昨日)またはweekly.2(2週間前)などでも直接アクセスできます。

Sambaでバックアップフォルダーを再共有すると、ユーザーはPCをバックアップサーバーに向けるだけで、バックアップからファイルを取得できます。

もう1つの非常に良いオプションはrdiff-backupです。ただし、エクスプローラーを\\ servernameに移動するだけで、常にファイルにアクセスできるようにしたいので、rsnapshotは私にとってより良いソリューションでした。


rdiff-backupの最後のリリースは2009年のものです。非常にうまく設計されていて、更新をまったく必要としませんか、それとも単に放棄されたプロジェクトですか?
マテウスコニエチュニー

それが改善されているかどうかはわかりませんが、基本的には「完了」です。
shodanshok

savannah.nongnu.org/bugs / ...を見ると、2015年までに何らかのアクティビティがあったようですが、多くのバグレポートは無視されます。私はそれを放棄されたものとして分類すると思います。
マテウスコニエチュニー

2

基本的にバージョン付きのバックアップが可能なため、gitでバックアップするのと同じ考えがありました。次に、その機能(およびその他)を提供するrdiff-backupを見ました。それは本当に素晴らしいユーザーインターフェースを持っています(CLIオプションを見てください)。それにとても満足しています。--remove-older-than 2Wかなりクールです。2週間以上前のバージョンを削除することができます。rdiff-backupファイルの差分のみを保存します。


2

私はgitを初めて使用しますが、デフォルトではローカルブランチではないため、リモートリポジトリに明示的にプッシュする必要がありますか?これは不快で予期せぬ驚きでした。結局のところ、ローカルリポジトリのすべてをサーバーに「バックアップ」する必要はありませんか?git bookを読む:

ローカルブランチは、書き込み先のリモートに自動的に同期されません。共有したいブランチを明示的にプッシュする必要があります。これにより、共有したくない作業にプライベートブランチを使用し、共同作業したいトピックブランチのみをプッシュアップできます。

これは、ローカルマシン上の他のgit以外のファイルと同様に、これらのローカルブランチは、git以外の手段で定期的にバックアップしない限り失われる危険があることを意味します。とにかくこれを行いますが、それは私のレポジトリでgitの「すべてをバックアップする」という仮定を破りました。これについての説明が欲しい!


1
リモートを除くgitのほとんどすべてはローカルです。それは仕様によるものです。特にこのシナリオのようにバックアップに使用する場合は、リモートに物事をプッシュできます。ブランチについても、はい、リモートに追加したい場合は明示的にプッシュする必要があります。多くの場合、何かをテストしたいので、開発のためにこれは素晴らしいですが、そのテストブランチを無期限に保存する必要はありません。必要なものが揃ったら、おそらくdevブランチにマージして、テストブランチを削除します。
LocalPCGuy 14

1

私はこれが私の開発者ボックスにとって良い方法であることがわかりました。それらを、展開エンドポイントのみにバックアップする必要があるものから変更します。

すべての構成およびパッケージのインストールマニフェストはPuppetに保存されるため、簡単に再展開および構成を更新できます。Puppetディレクトリはgitでバックアップされます。キックスタートは、初期展開を行うために使用されます。

また、その時点で開発されているパッケージにはすべてカスタムYUMリポジトリを保持しています。これには、作業しているパッケージがローカルシステムに無人のバイナリとして残されているだけでなく、それが発生してファイルが正常に削除されてしまうという利点もあります。誰かが適切な手順に従わなかった。



1

それは使用されるアプローチです、それは理にかなっています。

Keepconfは、このジョブにrsyncとgitを使用します。これは、物事を簡単に保つためのこのツールのラッパーです。

必要なのは、バックアップサーバーへのアクセス用に設定されたsshキーを備えた中央サーバーと、構成ファイルの数行だけです。たとえば、これはすべての/ etc /およびdebianパッケージをインストールしたままにするための私自身のファイルです:

[hosts]
192.168.1.10
192.168.1.11
192.168.1.12

[files]
/etc/*
/var/lib/dpkg/status

これで、rsyncバックアップとgitコミットができました。


0

私の個人的な意見では、これは基本的にすべて逆です。ファイルを引き出すのではなく、バックアップソリューションにプッシュします。

そもそもサーバーの構成を集中管理してから、パペットのようなものを使用してそれをプルダウンする方がずっと良いでしょう。

とはいえ、うまくいくかもしれませんが、私はそれがそんなに良いとは思いません。

backuppcを調べてみてください-セットアップは非常に簡単で、率直に言って素晴らしいです。


0

多少は機能しますが、2つの注意点があります。

  1. コミットを行うときに、ファイルの追加は自動的に選択されません。--porcelean om git statusを使用して、コミットする前に追加する新しいものを見つけます。

  2. .sshのリモートマウントが面倒なのはなぜですか?あなたはそれが失敗したことを知らないBdは壊れやすいです。通常のsshキーログインで遠端にベアリポジトリを使用します。リポジトリがむき出しで、1つのソースからのみプッシュする限り、マージなしで動作することが保証されています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.