1. ホーム
  2. git

[解決済み] 複数の git リポジトリをどのように整理し、すべてのリポジトリが一緒にバックアップされるようにするか?

2023-01-03 10:54:18

質問

SVN では、私はサーバー上に単一の大きなリポジトリを持っており、いくつかのマシンでチェックアウトしていました。これはかなり良いバックアップ システムであり、どのマシンでも簡単に作業することができました。私は特定のプロジェクトをチェックアウトし、コミットして、それが「マスター」プロジェクトを更新するか、または全体をチェックアウトすることができました。

現在、私はさまざまなプロジェクトのためにたくさんの git リポジトリを持っており、そのうちのいくつかは github にあります。また、私が言及した SVN リポジトリもあり、git-svn コマンドによってインポートされます...

基本的に、私はすべてのコード(プロジェクトだけでなく、ランダムなスニペットやスクリプト、私の履歴書、私が書いた記事、私が作ったWebサイトなど)を、リモートマシンやバックアップ用のメモリースティック/ハードドライブに簡単にクローンできる1つの大きなリポジトリに持つのが好きです。

問題は、それがプライベートなリポジトリであり、git が特定のフォルダーのチェックアウトを許可しないことです (別のプロジェクトとして github にプッシュすることはできますが、変更はマスター レポとサブレポの両方に表示されます)。

I を使うこともできますが、それは私が望むようには動作しません (サブモジュールは他のリポジトリへのポインタであり、実際のコードを含んでいないので、バックアップには役に立ちません)。

現在、私はgit-reposのフォルダ(例えば、~/code_projects/proj1/.git/ ~/code_projects/proj2/.git/ )を持っていて、proj1への変更の後、私は次のようにします。 git push github そして、ファイルを ~/Documents/code/python/projects/proj1/ にコピーして、(個々のリポジトリにある多数のコミットの代わりに)1つのコミットを行います。それから git push backupdrive1 , git push mymemorystick など

そこで、質問です。個人的なコードやプロジェクトをどのようにgitリポジトリで管理し、同期やバックアップをとっているのでしょうか?

どのように解決するのですか?

私なら <強い 強く に無関係なデータを置くことはお勧めしません。 に入れることをお勧めします。 新しいリポジトリを作成するオーバーヘッドは非常に低く、これは非常に重要です。 であり、それは 機能 これは 異なる系統を完全に分離することが可能です。

その考えと戦うことは、不必要に絡まった歴史を終わらせることを意味します。 管理はより難しくなり、さらに重要なのは さらに重要なのは、その結果、考古学の道具が希薄になり、使い勝手が悪くなることです。 を使わなくなります。 また、あなたがおっしゃるように、Gitはquot;クローニングの単位を想定しています。 クローンする単位がリポジトリであることを前提にしていますし、事実上そうしなければなりません。 その分散された性質のために、事実上そうしなければなりません。

一つの解決策は、すべてのプロジェクト/パッケージ/その他を、それ自身の をむき出しにすることです。 リポジトリ (すなわち、作業ツリーなし) として、祝福された階層の下に置くことです。 のようにすることです。

/repos/a.git
/repos/b.git
/repos/c.git

いくつかの慣例が確立されると、管理操作 (バックアップ、梱包、ウェブ公開) を 管理操作(バックアップ、梱包、Web公開)を適用することができるようになります。 とは全く異なる役割を果たします。 モノリシックなSVNリポジトリと全く同じ役割を果たします。 これらのリポジトリでの作業も このリポジトリでの作業も、SVN のワークフローと多少似ていますが、1 つの できる ローカルコミットやブランチを使用することができます。

svn checkout   --> git clone
svn update     --> git pull
svn commit     --> git push

各ワーキングクローンに複数のリモートを置くことができます。 複数の関係者間で同期を取りやすくするためです。

$ cd ~/dev
$ git clone /repos/foo.git       # or the one from github, ...
$ cd foo
$ git remote add github ...
$ git remote add memorystick ...

そして、それぞれのソースからフェッチ/プルを行い、ローカルで作業とコミットを行い、そして、プッシュ("backup")することができます。 ローカルで作業とコミットを行い、準備ができたらそれぞれのリモートへプッシュ ("backup") します。 をプッシュします。 と同じ コミット と履歴を各リモートにプッシュしていることに注目してください!)

$ for remote in origin github memorystick; do git push $remote; done

最も簡単な方法は、既存のワーキングリポジトリを ~/dev/foo をそのようなベアリポジトリにするのは、おそらく

$ cd ~/dev
$ git clone --bare foo /repos/foo.git
$ mv foo foo.old
$ git clone /repos/foo.git

とほぼ等価であり svn import --と同じですが 既存の、"local" の履歴を捨てません。

注意してください。 サブモジュール は共有の に関連する であるため、この問題に対する適切なツールとは考えられません。 そのため、あなたが解決しようとしている問題には適切なツールではないと思います。