238

何らかの理由で、使用するリポジトリは1つだけです。
しかし、私にはプロジェクトやアプリプロジェクトを含む複数のプロジェクトがあります。javaPHP scriptsAndroid

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

問題を解決するための簡単な方法(たとえば、意見ではなく設計による)はありますか?

4

3 に答える 3

236

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

解決策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
于 2013-02-04T04:22:01.907 に答える
22

解決策3

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

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

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

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

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

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

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.prog。ディレクトリで作業しているときは、thesis追跡されていないチェスプログラムファイルに邪魔されてはいけません。他のプロジェクトから追跡されていないファイルを削除しなくても、楽しく作業できる場合があります。

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

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

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

project1/master
project1/featureABC
project2/master
project2/featureXYZ
于 2017-08-04T10:45:27.503 に答える
17

私は使用しますgit submodules

GitリポジトリのGitリポジトリはこちらをご覧ください

2019年2月のように、私は提案しますMonorepos

于 2017-08-04T10:50:26.737 に答える