12

次のフォルダー構造があります。

foo/
foo/bar
foo/baz
foo/bee

foo/bar/.git に git リポジトリを作成しました。

後で、foo の他のすべてのディレクトリを git リポジトリに含める必要があることに気付き、foo/.git に git リポジトリを作成しました。

foo/.git
foo/bar/.git
foo/baz
foo/bee

foo/bar/.git を削除することもできますが、その git リポジトリの履歴を foo/bar/.git ではなく foo/.git 内に保持できるようにしたいと考えています。

サブモジュールを読み込もうとしていましたが、正しく理解できれば、既存のリポジトリのバージョンを独自のリポジトリのサブツリーとして統合する方法です。

これが私が必要としているものかどうかは完全にはわかりません。foo/bar/.git を保持する必要はありません。foo/.git をメインのリポジトリにしたい。foo/bar/.git 内の foo/bar/.git の履歴を保持または統合して、foo/bar/.git を削除できるようにする方法があるかどうかを知りたかっただけです。

4

3 に答える 3

9

barにディレクトリを作成しfoo/bargit mvすべてをfoo/bar/barに移動してから (git を使用せずに) に移動foo/bar/.gitし、.git最後に空になったサブフォルダーを削除してください。foo/bar/barfoo/barfoo/bar/bar

次に、残りのサブディレクトリを git リポジトリに追加できます。これは現在 にありfooます。

于 2012-05-03T10:31:23.507 に答える
6

サブツリーのマージを探しています

Github のヘルプには、これに関する優れたガイドがあり、Pro Git には、Git コミュニティの本と同じ章があります。

于 2012-05-03T10:38:48.183 に答える
3

filter-branchリポジトリのクローンに対して を1 回呼び出すことをお勧めします。

git filter-branch --index-filter 'git ls-files -s | sed "s-\t\"*-&bar/-" |
           GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info &&
         mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE'  --tag-name-filter cat -- --all

これにより、すべてのファイルがサブディレクトリ 'bar' に移動され、すべてのリビジョン履歴 (すべてのブランチとタグ) が書き換えられます。

これで、書き換えられた履歴を新しいリポジトリとして扱うことができます。

(コマンドは のサンプルから変更man git-filter-branch):


オプションの背景情報

古い cruft/reflogs/filter ブランチのバックアップを削除するには、次のようにします。

git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
git reflog expire --expire=now --all
git gc --prune=now

もちろん、レポを複製してバックアップ/ガベージを取り除くこともできます。

于 2012-05-03T10:39:21.353 に答える