リポジトリの.gitディレクトリを親ディレクトリに移動できますか?
-
03-07-2019 - |
質問
2つのサブディレクトリがあり、それぞれにリポジトリがあります:
PPP/
|--ABC/
| |--.git/
| |--AAA/
| | BBB/
| | CCC/
|
|--DEF/
| |--.git/
| |--DDD/
| |--EEE/
これらを1つのリポジトリに結合したいので、ディレクトリ構造は次のようになります。
PPP/
|--.git/
|--ABC/
| |--AAA/
| |--BBB/
| |--CCC/
|
|--DEF/
| |--DDD/
| |--EEE/
これは可能ですか?
現在、複数の人が自分のマシンにリポジトリを持っています。それはどれほど複雑になりますか?
Ta。
解決
次のように、説明していることを実行できます。
-
ABC
のコンテンツをABC /
サブディレクトリに移動し、履歴が常に存在するように修正します。$ cd /path/to/ABC $ git filter-branch --index-filter \ 'git ls-files -s | sed "s-\t-&ABC/-" | GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ git update-index --index-info && mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD
ディレクトリ構造は
ABC / ABC / your_code
になりました
-
DEF
の内容と同じ:$ cd /path/to/DEF $ git filter-branch --index-filter \ 'git ls-files -s | sed "s-\t-&DEF/-" | GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ git update-index --index-info && mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD
ディレクトリ構造は
DEF / DEF / your_code
になりました
-
最後に、
PPP
リポジトリを作成し、ABC
とDEF
の両方をそこにプルします:$ mkdir /path/to/PPP $ cd /path/to/PPP $ git init $ git pull /path/to/ABC $ git pull /path/to/DEF
これで、
PPP / ABC / your_code
とPPP / DEF / your_code
がすべての履歴とともに表示されます。
おそらく、全員が同期されるように、同僚にシステムで前のコマンドを実行するよう依頼する必要があります。
注:ファンキーな
filter-branch
コマンド manページからアクセス。 :-)
他のヒント
本当に2つの既存のリポジトリを1つのリポジトリにマージする必要がありますか、それともグループ化するだけですか?
それらをグループ化するだけの場合、git-submoduleは必要な処理を行います。トップレベルの1つが現在の2つにリンクする3つのリポジトリが作成されます。
ガイドとして:
-
1つのバージョンのレポAを別のバージョンのレポBと使用する意味がなくなるように、それらの間のカップリングを増やす場合は、それらを単一のリポジトリにマージする必要があります。
-
サブモジュールが多少離れている場合は使用する必要があります(単独で作業するのが理にかなっている場合があります)が、一緒に作業できるという利便性が必要です(たとえば、両方を同時にダウンロード、チェックポイント両方にまたがる既知の良好な状態など)。
サブモジュールを使用すると、履歴が変更されないため、リポジトリの既存のコピーに関する問題を回避できます。それらをマージすると新しい履歴が作成され、既存のブランチで作業している人々が変更をマージするのが難しくなります。
私にとっては、両方のプロジェクトの履歴がマージされないため、希望する方法で行うのは難しいようです。
私の最善のアドバイスは、ABCとDEFを含む新しいリポジトリを作成し、これらの2つの古いリポジトリを保持して履歴バックアップを作成し、この新しいプロジェクトで新しい履歴を開始することです。