1つのディレクトリに2つのgitリポジトリ?


89

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


git subtree仕事を成し遂げるでしょう。
Syd Pao

あまり多くのファイルを処理していない場合は、シンボリックリンク/ジャンクションを作成することもできます。
thdoan

回答:


38

私があなたのしていることを理解していれば、マシンごとに別々のブランチと、共通のホームディレクトリ構成ファイルを含むブランチを使用して、すべてを1つのリポジトリで処理できます。

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

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


1
サブモジュールも機能しますが、これが私にとって最善のアプローチだと思います。ローカルファイルはテンプレートに従います。MASTERブランチでテンプレートに変更を加えると、それらをマシンのローカルブランチにマージして、ローカル構成ファイルを段階的に更新できます。助けてくれてありがとう!
Joe Casadonte 2009年

MercurialとGitの両方を使用してください。
リンク

178

この記事はこれを比較的よくカバーしています:

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

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

.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に変更する小さなスクリプトを作成できます。


1
エイリアスとして設定すると、次のエラーがスローされます。$ git config --global alias.pub '-git-dir =〜/ Server / www / .gitpublic' $ git pubadd。致命的:エイリアス「pub」は環境変数を変更しますこれを行うには、エイリアスで「!git」を使用できます。この場合、「!git」はどこに設定しますか?
JaredBroad 2014

1
@JaredBroad興味深い-gitエイリアスではなくBashエイリアスを使用することを提案していました。Likealias gitone='git --git-dir=.gitone'
Chris Moschini 2014

10
独自の除外ファイルを使用するようにリポジトリを構成し、それら、つまりgitone config core.excludesfile gitone.excludeおよびを追跡できますgitone add gitone.exclude。このソリューションを拡張するスクリプトを作成しました:github.com/capr/multigit

2
@JaredBroad私はそれからこのようにしgit config --global alias.youralias '!git --git-dir="/d/MyProject/_git"'ましたgit youralias status:)
starikovs 2016

1
.gitignoreファイルは通常設定され忘れられていると想定する場合は、リポジトリごとに異なるコピーを作成してから、関連するバージョンをエイリアスの一部としてディレクトリにコピーできます。これは、次のようなルート内の他のファイルことかもしれない紛争に適用されるREADME.md.gitattributes
thdoan

15

gitサブモジュールを見てください。

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


8
ディレクトリのルートにある必要があるファイルには適していません。そこでの唯一のチャンスは、これらへのシンボリックリンクのルートを埋めることです。
WhyNotHugo 2010年

6

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

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


6

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


4

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


3

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

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

注意:「gitadd」は使用しないでください


0

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

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

  1. Repo1 / FolderA
  2. Repo1 / FolderB

そして:

  1. Repo2 / FolderC

フォルダFolderAFolderBRepo1から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

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

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

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