概要
開発中に様々な理由からこれまでの歴史を変更したくなることがあります。今回はその中でも、リポジトリ・ルートを親ディレクトリに移すことを試みます。
例えば、下記のような構造のワーキング・ディレクトリを
public/
├── index.cgi
└── img
下記のように変更するということです
new_root/
└── public
├── index.cgi
└── img
ちなみに、今回の目的とは逆方向、サブディレクトリを新たなルートにする方法はGit Bookに記載されています。
注意
これらリポジトリの歴史を変更する操作は、共用のリモート・リポジトリへまだpushしていない場合に限ります。
方法
リポジトリ・ルートを親ディレクトリにするということは、既存のすべてのファイルを1つのディレクトリに収めるという言い方もできます。すなわち、filter-branchを使って全履歴にわたってリポジトリ・ルートに有るすべてのファイルを1つのディレクトリに移動します。
ここでは、その1つのディレクトリの名前をpublic
にしましょう。結果的には下記のようなコマンドになります。
git filter-branch -f --tree-filter '[ -d public ] || mkdir public/; ls -1 --color=never | grep -v public | xargs -i% mv % public/' HEAD
mv
の-t
オプションは、今回はうまく作用しませんでした。そのためxargs
の-i
オプションを指定して引数をはめ込みました。