gitリポジトリに複数のプロジェクトを配置するためのベストプラクティスは何ですか?[閉まっている]


188

何らかの理由で、使用するリポジトリ1つしかありません。
しかし、私は持っている複数のプロジェクトを含むjavaプロジェクト、php scriptsおよびAndroidアプリケーションのプロジェクトを。

私の問題は、私が 異なるIDEを使用するリポジトリ内の異なるサブフォルダーにそれらを配置する必要がある
ことです。ご存知のように、各IDEはそれ自体のワークスペースを持つことができます。

問題を解決するためのベストプラクティスを誰が教えてくれますか?


1
考えられる解決策は、stackoverflow.com / questions / 5514739
Ragnarokkr

2
あなたは一人じゃない。学習目的で使用する私のリポジトリに同様のケースがあります(例:github.com/hopbit/java-sandbox)。私はチュートリアル私が...読み始める/すべての新しい本の例を試すために、新しいレポを作成したくない
ルカシュSiwiński

これを行う理由の1つは、テストや本番環境などのランタイム環境にデプロイする製品コードであるプロジェクトが1つある場合です。2番目のプロジェクトは、システムが最初のプロジェクト(BDDなど)をテストするアプリケーションです。これら2つのプロジェクトには密接な関係があり、1つのリポジトリURLを使用して全体を維持/参照できます。
ランスの種類

以下の要約:「Gitはこれらが同じプロジェクトの一部であるか別のプロジェクトの一部であるかを
知りません

回答:


198

ほとんどの人は複数のリポジトリを使用するように指示しますが、他の解決策があることは言及する価値があると思います。

解決策1

単一のリポジトリには、孤立したブランチと呼ばれる複数の独立したブランチを含めることができます。孤立したブランチは互いに完全に分離しています。それらは履歴を共有しません。

git checkout --orphan BRANCHNAME

これにより、現在のブランチとは無関係の新しいブランチが作成されます。各プロジェクトは、独自の孤立したブランチにある必要があります。

何らかの理由で、gitは孤立したチェックアウト後に少しクリーンアップを行う必要があります。

rm .git/index
rm -r *

削除する前にすべてがコミットされていることを確認してください

孤立したブランチがクリーンになると、通常どおり使用できます。

解決策2

孤立した枝の面倒をすべて避けてください。2つの独立したリポジトリーを作成し、それらを同じリモートにプッシュします。リポジトリごとに異なるブランチ名を使用するだけです。

# repo 1
git push origin master:master-1

# repo 2
git push origin master:master-2

おかげで、私の問題を解決できるはずです。実際、2つのソリューションはブランチを使用して異なるプロジェクトを保持しています。
Stony

6
ソリューション2を理解しているのかわかりません。すべての.gitファイルをマスターgitリポジトリにコミットしていますか?複数の孤立したブランチを使用することと複数のブランチを使用することの違いは何ですか?
2014年

14
@Nate彼が言っているのはこれです:2つの個別のローカルリポジトリを作成し、それら両方をGitHub上の同じリモートリポジトリにプッシュします。
帽子をかぶった男

1
@TheGuywithTheElfHatに感謝します。もう一度見てみると(9か月後)、私には明らかなようです。ソリューション2はまだ孤立したブランチを作成していますが、この方法の方が扱いやすいことがわかります。
2014

21
ソリューション2にはさらに説明が必要
eC Droid 2017

19

解決策3

これは、複数のプロジェクトで単一のディレクトリを使用するためのものです。この手法は、あるプロジェクトから別のプロジェクトに変更をプルする必要があることが多い密接に関連するプロジェクトに使用します。これは、孤立したブランチのアイデアに似ていますが、ブランチが孤立している必要はありません。同じ空のディレクトリ状態からすべてのプロジェクトを開始するだけです。

1つのコミットされた空のディレクトリからすべてのプロジェクトを開始する

このソリューションから不思議を期待しないでください。私が見ているように、あなたは常に追跡されていないファイルに煩わしさを感じるでしょう。Gitには実際にそれらをどうするかという手がかりがありません。そのため、コンパイラーによって生成され、.gitignoreファイルによって無視された中間ファイルがある場合、迅速にスワップしようとすると、しばらくハングアップする可能性があります。たとえば、ソフトウェアプロジェクトとPH.D論文プロジェクトの間。

しかし、これは計画です。空のリポジトリをコミットすることでgitプロジェクトを開始する必要があるように開始し、すべてのプロジェクトを同じ空のディレクトリ状態から開始します。これにより、2つのファイルがかなり独立していることが確実になります。また、ブランチに適切な名前を付け、「master」だけを怠惰に使用しないでください。プロジェクトは個別にする必要があるため、適切な名前を付けます。

Gitコミット(およびタグとブランチ)は基本的にディレクトリとそのサブディレクトリの状態を保存し、Gitはこれらが同じプロジェクトの一部であるか別のプロジェクトの一部であるかを知りません。そのため、gitが同じリポジトリに異なるプロジェクトを保存しても問題はありません。問題は、あるプロジェクトから追跡されていないファイルを別のプロジェクトを使用するときに消去するか、後でプロジェクトを分離することです。

空のリポジトリを作成する

cd some_empty_directory
git init
touch .gitignore
git add .gitignore
git commit -m empty
git tag EMPTY

空からプロジェクトを開始します。

1つのプロジェクトに取り組みます。

git branch software EMPTY
git checkout software
echo "array board[8,8] of piece" > chess.prog

git add chess.prog 
git commit -m "chess program"

別のプロジェクトを開始する

いつでも好きなときに。

git branch thesis EMPTY
git checkout thesis
echo "the meaning of meaning" > philosophy_doctorate.txt
git add philosophy_doctorate.txt 
git commit -m "Ph.D"

前後に切り替え

いつでも好きなときにプロジェクト間を行き来できます。この例は、チェスソフトウェアプロジェクトに戻ります。

git checkout software
echo "while not end_of_game do make_move()" >> chess.prog
git add chess.prog 
git commit -m "improved chess program"

追跡されていないファイルは迷惑です

ただし、プロジェクト/ブランチ間でスワップすると、追跡されていないファイルに悩まされることになります。

touch untracked_software_file.prog
git checkout thesis 
ls
    philosophy_doctorate.txt  untracked_software_file.prog

それは乗り越えられない問題ではありません

定義上、gitは追跡されていないファイルの処理方法を実際には認識しておらず、それらを処理するのはユーザー次第です。次のようにして、追跡されていないファイルが1つのブランチから別のブランチに持ち越されるのを停止できます。

git checkout EMPTY 
ls
    untracked_software_file.prog
rm -r *
    (directory is now really empty, apart from the repository stuff!)
git checkout thesis
ls
    philosophy_doctorate.txt

新しいプロジェクトをチェックアウトする前にディレクトリが空であることを確認することで、別のプロジェクトからの追跡されていないファイルがハングしていないことを確認しました。

洗練

$ GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01T01:01:01' git commit -m empty

空のリポジトリをコミットするときに常に同じ日付を指定すると、個別に作成された空のリポジトリコミットに同じSHA1コードが含まれる可能性があります。これにより、2つのリポジトリを個別に作成し、後で1つのリポジトリに共通のルートを持つ単一のツリーにマージすることができます。

# Create thesis repository. 
# Merge existing chess repository branch into it

mkdir single_repo_for_thesis_and_chess
cd single_repo_for_thesis_and_chess
git init
touch .gitignore
git add .gitignore
GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01:T01:01:01' git commit -m empty
git tag EMPTY
echo "the meaning of meaning" > thesis.txt
git add thesis.txt
git commit -m "Wrote my PH.D"
git branch -m master thesis

# It's as simple as this ...
git remote add chess ../chessrepository/.git
git fetch chess chess:chess

結果

マージされたリポジトリの図

プロジェクトごとにサブディレクトリを使用しますか?

たとえば、ファイルを作成する代わりに、プロジェクトを可能な限りサブディレクトリに保存すると役立つ場合もあります。

chess.prog
philosophy_doctorate.txt 

持ってる

chess/chess.prog
thesis/philosophy_doctorate.txt 

この場合、追跡されていないソフトウェアファイルはになりますchess/untracked_software_file.progthesisディレクトリで作業するときは、追跡されていないチェスプログラムファイルに邪魔されないようにしてください。追跡されていないファイルを他のプロジェクトから削除せずに楽しく作業できる場合があります。

また、他のプロジェクトから追跡されていないファイルを削除する場合は、不要なファイルをそれぞれ選択して削除するよりも、不要なディレクトリをダンプする方が速く(エラーが発生しにくく)なります。

ブランチ名には「/」文字を含めることができます

したがって、ブランチに次のような名前を付けることができます

project1/master
project1/featureABC
project2/master
project2/featureXYZ

9

私は使用しますgit submodules

GitリポジトリのGitリポジトリをご覧ください

2019年2月に従って、私はお勧めします Monorepos


5
「使用するリポジトリは1つだけです。」同じリポジトリに複数のサブモジュールを保存する方法を説明してもらえますか?
Ivan

4
git submodule add [url to git repo]- git-scm.com/book/en/v2/Git-Tools-Submodules
prasanthv

3
なぜ「モノレポス」なのか説明してもらえますか?
sophievda
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.