[解決済み] サブディレクトリを別のGitリポジトリに切り離す(移動する)。
質問
私は ジット リポジトリは、いくつかのサブディレクトリを含んでいます。今、私はサブディレクトリの1つが他のものと無関係であることを発見し、別のリポジトリに切り離す必要があることを発見しました。
サブディレクトリ内のファイルの履歴を維持したまま、これを行うにはどうしたらよいでしょうか。
クローンを作って、それぞれのクローンの不要な部分を削除すればいいのでしょうが、これでは古いリビジョンなどをチェックアウトするときに完全なツリーができてしまうと思います。これは許容範囲かもしれませんが、私は2つのリポジトリが履歴を共有していないように見せかけることができる方が望ましいと思います。
念のため、以下のような構成にしています。
XYZ/
.git/
XY1/
ABC/
XY2/
でも、その代わりにこうしてほしい。
XYZ/
.git/
XY1/
XY2/
ABC/
.git/
ABC/
解決方法は?
更新情報
: このプロセスは非常に一般的なものなので、git チームは新しいツールでこれをよりシンプルにしました。
git subtree
. こちらをご覧ください。
サブディレクトリを別のGitリポジトリにデタッチ(移動)させる
リポジトリをクローンして、その上で
git filter-branch
を使用して、新しいレポのサブディレクトリ以外のすべてをガベージコレクトするようにマークします。
-
ローカルリポジトリのクローンを作成する。
git clone /XYZ /ABC
(注意: リポジトリはハードリンクを使用してクローンされますが、ハードリンクされたファイル自体は変更されないので問題ありません - 新しいファイルが作成されます)。
-
次に、同様に書き換えたい興味深いブランチを保存し、そこへのプッシュを避け、古いコミットがオリジンから参照されないようにするためにオリジンを削除しましょう。
cd /ABC for i in branch1 br2 br3; do git branch -t $i origin/$i; done git remote rm origin
またはすべてのリモートブランチに適用されます。
cd /ABC for i in $(git branch -r | sed "s/.*origin\///"); do git branch -t $i origin/$i; done git remote rm origin
-
ここで、サブプロジェクトと関係のないタグも削除したくなるかもしれません。これは後で行うこともできますが、レポを再度プルーンする必要があるかもしれません。私はそうしなかったので
WARNING: Ref 'refs/tags/v0.1' is unchanged
さらに、このようなタグを削除すると、より多くのスペースが再生されます。どうやらgit filter-branch
は他のタグを書き換えることができるはずですが、これは確認できませんでした。すべてのタグを削除したい場合はgit tag -l | xargs git tag -d
. -
そして、filter-branch と reset を使って他のファイルを除外し、刈り込みができるようにします。さらに
--tag-name-filter cat --prune-empty
を使用して、空のコミットを削除し、タグを書き換えます(この場合、署名を削除する必要があることに注意してください)。git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter ABC -- --all
または、HEADブランチのみを書き換え、タグや他のブランチを無視することもできます。
git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter ABC HEAD
-
次に、バックアップのリブログを削除して、スペースを本当に取り戻すことができます(ただし、この操作は破壊的です)。
git reset --hard git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d git reflog expire --expire=now --all git gc --aggressive --prune=now
これで、ABC サブディレクトリのローカル git リポジトリが、そのすべての履歴を保存した状態でできあがりました。
注:ほとんどの用途で
git filter-branch
は、実際に追加されたパラメータを持つべきです。
-- --all
. はい、それは本当に
-
-
スペース
-
-
all
. これはコマンドの最後のパラメータにする必要があります。Matli が発見したように、これによってプロジェクトのブランチとタグが新しいリポジトリに含まれたままになります。
編集:以下のコメントから様々な提案を取り入れ、例えば、リポジトリが実際にシュリンクされることを確認しました(以前は必ずしもそうではありませんでしたが)。
関連
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] Git リポジトリでのマージの衝突を解決するには?
-
[解決済み] リモート Git リポジトリの URI (URL) を変更するには?
-
[解決済み] 新しいローカルブランチをリモートの Git リポジトリにプッシュし、それを追跡するにはどうすればよいのでしょうか?
-
[解決済み] ローカルの Git リポジトリが元々クローンされた URL を特定するにはどうすればよいですか。
-
[解決済み] Git リポジトリで削除されたファイルを検索して復元する方法
-
[解決済み] Git リポジトリを特定のフォルダにクローンする方法は?
-
[解決済み] Git で最新のコミットを新しいブランチに移動する
-
[解決済み】Git リポジトリに空のディレクトリを追加するには?
-
[解決済み】Gitで、既存の未コミットの作業を新しいブランチに移動する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】gitがローカルバージョンをリモートバージョンに置き換える
-
[解決済み】git rev-parseは何をするのですか?
-
[解決済み】ファイルのアンリンクに失敗しました。もう一度試してみるべきですか?
-
[解決済み】Githubエンタープライズ - リモート。Git の操作でパスワード認証が利用できない
-
[解決済み] [Solved] 作業ツリーのディレクトリ 'example.com' を作成できませんでした。パーミッションが拒否されました
-
Gitのプッシュでエラーが発生! [リモート拒否] master -> master (pre-receive hook declined) error: failed to push some refs to .......
-
[解決済み】マージが終了していません(MERGE_HEADは存在します)。
-
[解決済み] ERROR: リモートレポ 'origin' のクローン作成に失敗しました。
-
[解決済み] TortoiseGitで「git did not exit cleanly (exit code 128)」というエラーを解決するには?[クローズド]
-
[解決済み] git commit signing failed: secret key not available.