web-dev-qa-db-ja.com

1つのディレクトリに2つのgitリポジトリがありますか?

1つのディレクトリに2つのgitリポジトリを置くことは可能ですか?私はそうは思わないだろうが、私は尋ねると思った。基本的に、作業中のすべてのマシンで共通するはずのホームディレクトリ設定ファイル(例:.emacs)をチェックインしますが、マシン固有の構成。私がそれを行うことを考えることができる唯一の方法は、サブディレクトリにローカル設定を持ち、メインのgitリポジトリからそのサブディレクトリを無視することです。他のアイデアはありますか?

78
Joe Casadonte

私があなたがしていることを理解しているなら、あなたはすべてを一つのリポジトリで扱うことができ、各マシンに別々のブランチを使用し、共通のホームディレクトリ設定ファイルを含むブランチを使用します。

リポジトリを初期化し、共通ファイルをコミットします。おそらく、MASTERブランチの名前をCommonに変更します。次に、操作するマシンごとにそこから個別のブランチを作成し、マシン固有のファイルをそのブランチにコミットします。共通ファイルを変更するときはいつでも、共通ブランチを各マシンブランチにマージし、他のマシンにプッシュします(多くの場合、そのためのスクリプトを記述します)。

次に、各マシンで、そのマシンのブランチをチェックアウトします。ブランチには、共通の構成ファイルも含まれます。

32
Paul

この記事では、これについて比較的よく取り上げています。

https://github.com/rrrene/gitscm-next/blob/master/app/views/blog/progit/2010-04-11-environment.markdown

基本的に、コマンドラインから作業している場合、これは予想よりも簡単です。 2つのgitリポジトリが必要だとします:

.gitone
.gittwo

次のように設定できます。

git init .
mv .git .gitone
git init .
mv .git .gittwo

ファイルを追加して、次のように1つだけにコミットできます。

git --git-dir=.gitone add test.txt
git --git-dir=.gitone commit -m "Test"

したがって、gitのオプションが最初に来て、次にコマンド、次にgitコマンドのオプションが来ます。次のようなgitコマンドのエイリアスを簡単に作成できます。

#!/bin/sh
alias gitone='git --git-dir=.gitone'
alias gittwo='git --git-dir=.gittwo'

したがって、gitone commit -m "blah"のように、もう少し入力するだけでどちらかにコミットできます。

トリッキーになると思われるのは無視です。 .gitignoreは通常プロジェクトルートにあるため、ルート全体を切り替えることなくこれを切り替える方法を見つける必要があります。または、.git/info/excludeを使用できますが、実行したすべての無視はコミットまたはプッシュされないため、他のユーザーを台無しにする可能性があります。いずれかのリポジトリを使用する他のユーザーは、.gitignoreをプッシュする可能性があり、競合が発生する可能性があります。これらの問題を解決する最良の方法は私には明らかではありません。

TortoiseGitのようなGUIツールを好む場合は、いくつかの課題もあります。これらのツールの前提が満たされるように、.gitoneまたは.gittwoの名前を一時的に.gitに変更する小さなスクリプトを作成できます。

143
Chris Moschini

git submodule をご覧ください。

サブモジュールを使用すると、常に特定のコミットを指すソースツリーの専用サブディレクトリ内に外部リポジトリを埋め込むことができます。

14
Hates_

RichiHは vcsh というツールを作成しました。このツールは、gitの偽の裸リポジトリを使用してドットファイルを管理し、$ HOMEに複数の作業ディレクトリを配置します。 csh AFAIKとは関係ありません。

ただし、複数のディレクトリがある場合、git-submodules(これは最良の状況では苦痛であり、この例の使用は最良の状況ではありません)の代替は gitslave であり、スレーブリポジトリを残します常にブランチの先端でチェックアウトし、子会社のレポジトリで変更を行うために3ステップのプロセスを必要としません(正しいブランチにチェックアウトし、変更を行ってコミットし、スーパープロジェクトに移動して新しいプロジェクトをコミットしますサブモジュールのコミット)。

5
Seth Robertson

変数GIT_DIRを使用することで可能ですが、何をしているのかわからない場合は多くの注意事項があります。

5
tzervo

ええ、サブモジュールはおそらくあなたが望むものです。別のオプションは、作業コピーをサブディレクトリに配置し、ホームディレクトリから目的のファイルへのシンボリックリンクをポイントすることです。

4
Pat Notz

私の好ましい方法は、サブディレクトリでリポジトリを使用し、再帰的なシンボリックリンクを使用することです:

git clone repo1
cd somerepo
git clone repo2
cd repo2
./build

repo/build」ファイルは次のようになります。

#!/bin/bash 
SELF_PATH="$(dirname "$(readlink -f "$0")" )"  # get current dir 
cd .. && git stash && git clean -f -d ''       # remove previous symlinks
cp -sR "$SELF_PATH"/* ../.                     # create recursive symlinks in root

注意: 'git add。'を使用しないでください

3

他のオプションは、それらを別々のフォルダーに配置し、1つのフォルダーから別のフォルダーへのシンボリックハードリンクを作成することです。

たとえば、リポジトリがある場合:

  1. Repo1/FolderA
  2. Repo1/FolderB

そして:

  1. Repo2/FolderC

フォルダーFolderAFolderBをRepo1からRepo2にシンボリックリンクできます。 Windowsの場合、Repo1で実行するコマンドは次のとおりです。

User@Repo1$ mklink /J FullPath/Repo2/FolderA FullPath/Repo1/FolderA
User@Repo1$ mklink /J FullPath/Repo2/FolderB FullPath/Repo1/FolderB
User@Repo1$ printf "/FolderA/*\n/FolderB/*\n" >> .gitignore

メインリポジトリ上のファイルについては、それらをそれぞれシンボリックリンクし、リポジトリに追加する必要があります.gitignoreノイズを避けるため、必要でない限り。

0
user

免責事項:これは広告ではありません。私は提供されたライブラリの開発者です。

複数のリポジトリを1つのフォルダーに混在させる場合に対処するために、git拡張機能を作成しました。 libの利点は、リポジトリとファイルの競合を追跡することです。 github で見つけることができます。また、試してみるための2つのリポジトリーの例もあります。

0
user1810087