複数の Git リポジトリを整理して、すべてが一緒にバックアップされるようにするにはどうすればよいでしょうか?

StackOverflow https://stackoverflow.com/questions/36862

  •  09-06-2019
  •  | 
  •  

質問

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

現在、さまざまなプロジェクト用の git リポジトリが多数あり、そのうちのいくつかは github 上にあります。先ほど述べた SVN リポジトリもあり、git-svn コマンドでインポートしました。

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

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

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

現在、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リポジトリに無関係なデータを入力することに対してアドバイスしてください。新しいリポジトリを作成するオーバーヘッドは非常に低く、それは 特徴 そのため、異なる系統を完全に分離することが可能になります。

そのアイデアと戦うということは、不必要にもつれた歴史で終わることを意味します。これは、管理をより困難にし、重要なことに、結果として生じる希釈のために「考古学」ツールがあまり役に立たないことです。また、あなたが述べたように、Gitは「クローニングの単位」がリポジトリであると想定しており、その分散した性質のために実際にそうしなければなりません。

解決策の 1 つは、すべてのプロジェクト/パッケージなどを保持することです。自分のものとして 祝福された階層の下で、次のような祝福された階層の下で、リポジトリ(つまり、作業中の木なし)

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

いくつかの規則が確立されると、「モノリシック」SVNリポジトリとはまったく類似していない役割を果たしている完全な階層に管理操作(バックアップ、パッキング、Webパブリッシング)を適用することが些細なことになります。これらのリポジトリを使用することは、SVNワークフローにも多少似ており、その追加によりできる ローカルのコミットとブランチを使用します。

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 ...

次に、各「ソース」から取得/引っ張り、局所的に作業してコミットしてから、準備ができたらこれらのリモコンのそれぞれにプッシュ(「バックアップ」)をプッシュできます(それがどのようにプッシュするかに注意してください 同じ それぞれのリモコンにコミットと歴史!):

$ 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- しかし、既存の「地元の」歴史を捨てません。

注記: サブモジュール 共有を含めるメカニズムです 関連している系統なので、私は実際にあなたが解決しようとしている問題のための適切なツールとは考えていません。

他のヒント

追加したい ダミアンの答え そこで彼は次のように勧めています。

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

1 つのコマンドで、すべての個々の実際のリモートにプッシュする特別なリモートをセットアップできます。で見つけました http://marc.info/?l=git&m=116231242118202&w=2:

したがって、「git push」(同じブランチを複数回プッシュすることは理にかなっている場合)では、実際に私がしていることをすることができます。

  • .git/config には次の内容が含まれます。

    [remote "all"]
    url = master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6
    url = login.osdl.org:linux-2.6.git
    
  • そしていま git push all master 「master」ブランチをプッシュします 両方
    それらのリモートリポジトリの。

次の構文を使用すると、URL を 2 回入力する手間を省くこともできます。

[url "<actual url base>"]
    insteadOf = <other url base>

また、これを処理する提案された方法にも興味があり、私が使用している現在の設定 (SVN を使用) について説明します。基本的に、独自の bin ディレクトリと lib ディレクトリを含むミニファイルシステム階層を含むリポジトリを作成しました。このツリーのルートには、これらの bin や lib などを追加するように環境をセットアップするスクリプトがあります。他のディレクトリを適切な環境変数にコピーします。したがって、ルート ディレクトリは基本的に次のようになります。

./bin/            # prepended to $PATH
./lib/            # prepended to $LD_LIBRARY_PATH
./lib/python/     # prepended to $PYTHONPATH
./setup_env.bash  # sets up the environment

/bin と /lib 内には、複数のプロジェクトとそれらに対応するライブラリがあります。これが標準プロジェクトではないことは承知していますが、グループ内の他の誰かがリポジトリをチェックアウトし、「setup_env.bash」スクリプトを実行して、すべてのプロジェクトの最新バージョンをローカルに保存するのは非常に簡単です。チェックアウト。/usr/bin または /usr/lib のインストール/更新について心配する必要がなく、複数のチェックアウトとチェックアウトごとの非常にローカライズされた環境を簡単に維持できます。リポジトリ全体を rm するだけで、プログラムのアンインストールを気にする必要がなくなります。

これは私たちにとってはうまく機能していますが、変更するかどうかはわかりません。これの問題は、この 1 つの大きなリポジトリに多数のプロジェクトが存在することです。このような環境を作成し、プロジェクトを独自のリポジトリに分割する git/Hg/bzr の標準的な方法はありますか?

,必要な状況に遭遇していないため、Git リポジトリのネストはまだ試していません。私が読んだように、 #gitチャンネル git はリポジトリを入れ子にすることで混乱するようです。git リポジトリ内で git-init を実行しようとしています。ネストされた Git 構造を管理する唯一の方法は、次のいずれかを使用することです。 git-submodule またはアンドロイドの repo ユーティリティ。

あなたが説明しているバックアップの責任については、私はこう言います 代表者 それ...私の場合、通常、各プロジェクトの「元の」リポジトリを職場のネットワーク ドライブに置き、IT 技術者が選択したバックアップ戦略に従って定期的にバックアップします。シンプルなので悩む必要がありません。;)

使ってみてはどうでしょうか 複数の Git リポジトリを一度に管理するには:

MR(1)コマンドは、一連のリポジトリで他のアクションをチェックアウト、更新、または実行することができます。転覆、GIT、CVS、Mercurial、BZR、DARCS、CVS、VCSH、化石、真実性リポジトリの任意の組み合わせをサポートし、他の改訂制御システムのサポートを簡単に追加できます。[...]

単純なシェルスクリプトを使用して非常に構成可能です。それができることのいくつかの例は次のとおりです。

[...]

  • git リポジトリを更新するときは、2 つの異なるアップストリームからプルし、その 2 つをマージします。
  • 複数のリポジトリ更新を並行して実行し、更新プロセスを大幅に高速化します。
  • ラップトップがオフラインであるために失敗したアクションを記憶しておき、オンラインに戻ったときに再試行できるようにします。

git リポジトリをネストする別の方法もありますが、それはあなたが求めている問題を解決するものではありません。それでも、解決策を探している他の人のために、私は次のように言いました。

最上位の git リポジトリでは、ネストされた git リポジトリを含む .gitignore 内のフォルダーを非表示にするだけです。これにより、2 つの別個の (ただしネストされた!) git リポジトリを簡単に作成できるようになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top