1. ホーム
  2. git

[解決済み] ある git リポジトリから別の git リポジトリ(クローンではない)へ、履歴を保持しながらファイルを移動する方法

2022-03-19 08:48:05

質問

私たちの Git リポジトリは、最初は一つのモンスター SVN リポジトリの一部で、個々のプロジェクトがそれぞれこのようなツリーを持っていました。

project1/branches
        /tags
        /trunk
project2/branches
        /tags
        /trunk

明らかに、ファイルを移動するのはかなり簡単で svn mv . しかし、Gitでは、各プロジェクトは独自のリポジトリにあり、今日、私はサブディレクトリを project2 から project1 . こんな感じでやってました。

$ git clone project2 
$ cd project2
$ git filter-branch --subdirectory-filter deeply/buried/java/source/directory/A -- --all
$ git remote rm origin  # so I don't accidentally overwrite the repo ;-)
$ mkdir -p deeply/buried/different/java/source/directory/B
$ for f in *.java; do 
>  git mv $f deeply/buried/different/java/source/directory/B
>  done
$ git commit -m "moved files to new subdirectory"
$ cd ..
$
$ git clone project1
$ cd project1
$ git remote add p2 ../project2
$ git fetch p2
$ git branch p2 remotes/p2/master
$ git merge p2 # --allow-unrelated-histories for git 2.9+
$ git remote rm p2
$ git push

しかし、それはかなり複雑なようです。一般的にこのようなことをするのに良い方法はあるのでしょうか?それとも、私は正しい方法を採用しているのでしょうか?

これは、単に他のリポジトリの一部から新しいスタンドアロンリポジトリを作成するのではなく、既存のリポジトリに履歴をマージすることになることに注意してください ( 以前の質問のように ).

どのように解決するのですか?

をクリックすると --subdirectory-filterfilter-branch がポイントでした。あなたがそれを使ったということは、本質的にもっと簡単な方法がないことを証明しています。あなたは(名前を変えた)ファイルのサブセットだけで終わらせたかったので、歴史を書き換えるしかなかったのですが、これは定義上ハッシュを変更することになります。標準的なコマンドはどれも(たとえば pull のように、履歴を書き換えてしまうので、これを達成するために使うことはできません。

もちろん、細部を改良することは可能です。クローンやブランチの一部は厳密には必要ではありませんでしたが、全体的なアプローチは優れています! しかし、全体的なアプローチは良いものです!複雑なのは残念ですが、もちろん、gitのポイントは履歴を簡単に書き換えることではありません。