5

多くのコミット/ブランチを含む長い (~2 年) リポジトリがありますが、何らかの理由で、リポジトリのルート フォルダーを 1 つ上のフォルダーに変更する必要があります。

概念を明確にするためのいくつかの例。

フォルダー内にリポジトリがあります。

c:\workspace\test\src\

私のレポには、上記のファイル/サブフォルダーのすべての変更があります。

リポジトリを次の場所に移動したいと思います。

c:\workspace\test

これからは、古いリポジトリ履歴を保持するテスト フォルダーにすべての変更を追加できます。

そのため、フォルダーでマークされているすべての古いコミットは、フォルダー"\"でチェックする必要があります"\src"

古いコミットの場合、フォルダーの実際のコンテンツを保持できるかどうかはわかりません (実際には関係ありません)。

それは可能ですか?

私が説明したことが理解できることを願っています..

4

5 に答える 5

3

レポの最上位ディレクトリがあり、新しい最上位ディレクトリにc:\workspace\test\なりたいということだと思います。c:\workspace\test\src\まず、次のようになっていることを確認します。

cd c:\workspace\test\src
git rev-parse --show-toplevel #print repo top-level directory

c:\workspace\test\それが本当にトップレベルのディレクトリであるかのように表示されるはずです。

そうである場合は、git filter-branchリベース コマンドを使用して、「src」ディレクトリを新しいトップレベルにすることができます。古い履歴を破壊的に変更するため、これは本当にやりたいことであることに注意してください。このブランチに影響を与えるすべてのコミットはsrc、新しいトップレベルとしてフォルダーを含むようにリベースされます。最初に現在のブランチをバックアップします。

cd c:\workspace\test\
git branch oldRoot #this backs up your current branch to a new branch called "oldRoot"    
git filter-branch --subdirectory-filter src HEAD #this modifies your history

警告!!!ご了承ください:

  1. 新しい履歴はきれいに適用されません。変更をリモートにバックアップしている場合は、次のいずれかを行う必要があります。
    1. 新しいリモート ブランチの使用を開始する (より安全)、または:
    2. 強制プッシュを実行して、リモート履歴を上書きします。
  2. 他の誰かがこのレポであなたと協力していた場合、彼らはトラブルの山にいる可能性があります. リベースを行った後に変更をマージするのは難しいため、最初に変更をマージするようにしてください。

詳細については、Git Book の「サブディレクトリを新しいルートにする」および「リベースの危険性」セクションを参照してください。

于 2014-05-15T01:41:02.287 に答える
0

まず、レポを複製して、単独で作業できるようにし、ここで何か問題が発生した場合に元のレポジトリがそのまま残るようにします。

git clone --no-hardlinks c:\workspace\test\src c:\sandbox

単一のコミットで適切な変更を行うスクリプトを作成します。私は Windows スクリプトに詳しくありませんが、スクリプトで新しいサブディレクトリsrc(など ) を作成し、ディレクトリとファイル (などc:\sandbox\src)以外のすべてをその新しいサブディレクトリに移動する必要があります。現在の状態だけでなく、リポジトリ内のすべてのコミットでスクリプトが適切に機能することを確認してください。次に実行します。.git.git* .gitignore

git filter-branch --tree-filter c:\absolute\path\to\your\script

これにより、git はリポジトリ内の各コミットをチェックアウトし、スクリプトを実行してから、コミットを最終結果に置き換えます。次に、無視されたファイルまたはコミットされていないファイルがある場合は、それらを新しいリポジトリの適切な場所にコピーします。フィルターブランチが意図した効果を持ち、新しいレポが希望どおりに見えることを確認してください。満足していることを確認したら、削除c:\workspace\testしてから に移動c:\sandboxc:\workspace\testます。

--tree-filterここに示すように、 よりもを使用することを好み--index-filterます。効率的ではありませんが (インデックスを直接編集するのではなく、各コミットをチェックアウトする必要があるため)、はるかに直感的です。必要に応じて、リポジトリ内のファイルの内容を変更することもできます (おそらく絶対パスを更新します)。

于 2015-03-28T18:10:13.967 に答える
0
git filter-branch --index-filter '
    git read-tree $(printf "040000 tree %s\tsrc\n" `git rev-parse HEAD:` | git mktree)
    ' -- --branches --tags
mv .git ..
cd ..

これらのコマンドのドキュメントを参照してください。使い方はとても簡単です。filter-branchtmpfs で動作するようにすることに関するのドキュメントのアドバイスは、2 年間の歴史に対処する価値があると思われます。

grep -ri c.workspace.test .git設定などで絶対パスをチェックして、それらがまだ有効であることを確認することをお勧めします。

于 2014-05-15T03:22:18.113 に答える