あるgitリポジトリから別のgitリポジトリにフォルダを移動する方法の例をいくつか見つけました[これが1つです]。ただし、元のリポジトリを破壊するようです(正しく読んでいる場合)。私が必要としているのは、あるリポジトリから別のリポジトリに、履歴付きで、別のリポジトリにフォルダをコピーすることです。次のようなもの:
Repo A:
/myApp/
/deploy/...
/src/...
/test/...
/bin/...
Repo B:
/myDeploymentCode/
/projects/
/myWebService/...
/myWebsite/...
コピー後、私はそれを次のようにしたいと思います:
Repo A:
/myApp/
/deploy/...
/src/...
/test/...
/bin/...
Repo B:
/myDeploymentCode/
/projects/
/myWebService/...
/myWebsite/...
/myApp/... << full copy of the deploy folder from myApp
元のデプロイフォルダを削除する可能性がありますが、明確になるまでそのままにしておきたいと思います。
私はこれが可能であると推測していて、私はただ盲目です。そうでない場合は、ファイルを手動で移動するだけで済みます。すべての履歴を失いますが、現在の状態をキャプチャします。しかし、それは理想的とは言えません。
git subtree
次のコマンドを使用してこれを行うことができます(しばらくの間組み込み、contrib
以前に利用可能):
git subtree split -P myApp/deploy
リポジトリ「A」で使用して、その「myApp / deploy」フォルダーの内容のみを含む合成履歴を作成します。git subtree add -P myDeploymentCode/projects/myApp ...
マージコミットを使用してその履歴を「植え付ける」ために使用します。結果の唯一の問題は、抽出された履歴行のすべてのコミット(新しいコードベースとマージしたものを除く)が、ファイル内のファイルが「myDeploymentCode / projects / myApp」プレフィックスの下にあるという事実を記録しないことです。次のようなパス名またはパス名プレフィックスの履歴をトレースするコマンド
git log -- myDeploymentCode/projects/myApp/foo.txt
抽出された履歴を新しいコードベースに「移植」したマージコミットを超えて戻ることができない場合があります(この例では、ファイル「foo.txt」はそれらのコミットにありますが、プレフィックスの下ではなくトップレベルにあります)。
これでよければ、それを実行してください。それ以外の場合は、最初にgit filter-branch
抽出された履歴に対してエンカンテーションを実行して、履歴が植えられる新しい予想されるプレフィックスの下にファイルを持つように、それを形成するすべてのコミットを書き換える必要があります。
そのための1つの方法は
git filter-branch -f --tree-filter \
'test -e myDeploymentCode/projects/myApp || mkdir -p myDeploymentCode/projects/myApp
find . -mindepth 1 -maxdepth 1 \
-type d -path ./myDeploymentCode -prune -o -print \
| xargs -n 30 mv -t ./myDeploymentCode/projects/myApp' temp
(git subtree split
ステップ(1)で通知されたコミットのSHA-1名から「temp」という名前のブランチを作成したと仮定します。)
それがどのように機能するかについての詳細な説明を伴う同じ例については、これを参照してください。
履歴がgit subtree split
生成するのは合成であることに注意してください。つまり、履歴を構成するコミットのSHA-1名はソースリポジトリに存在しません。これは、Gitの内部に精通している人には明らかですが、blobは抽出された履歴によって再利用されますが、treeオブジェクトとcommitオブジェクトは再利用されませんが、念のため警告されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加