web-dev-qa-db-ja.com

Gitリポジトリを1階層上に移動する

Git初心者の質問:

私はmsysgitでローカルにバージョン管理されている小さなプライベートWebプロジェクトを持っています。私専用の外部リポジトリはないので、基本的には何でもできます。

プロジェクトディレクトリ、つまり「webroot」にこれを設定しました。

次に、webrootと並行して配置された2つ目のディレクトリを作成する必要がありました。それをアセットと呼びましょう。

そのため、構造は次のようになりました。

\ project directory
----\webroot
----\assets

この新しいディレクトリをgitリポジトリに含めたいので、そこに保存されているファイルのバージョンも変更しますが、もちろん「git add ../assets」は使用できません。また、project_directoryに新しいgitプロジェクトを作成することもしません。これにより、以前のコミットがすべて失われます。

リポジトリを「webroot」から「project_directory」に移動し、コミットを保持してから「assets」を含めることができるようにするにはどうすればよいですか?

65
Sorcy

したがって、gitリポジトリを次のようにする必要があります。

<projectdir>
    /.git
    /webroot
    /assets

これを行うには、既存のファイルリポジトリ内を新しいwebrootサブディレクトリに移動する必要があります。

cd <git repo root>
mkdir webroot
git mv <all your files> webroot
git commit --all -m "moved all existing files to new 'webroot' directory"

次に、ローカルファイルシステムで、現在のディレクトリの1つ上のディレクトリにクローンを再配置します。

cd <projectdir>
mv webroot/* .
rmdir webroot

次に、assetsディレクトリ(およびファイル)をgitリポジトリに追加します。

git add assets
git commit -m "added assets to the repo"
64
Tim Henigan

.git dirを1レベル上に移動して、ワークツリーを更新することもできます。

cd projectdir
mv ./webroot/.git ./.git
git config core.worktree /absolute-path-to-project-dir
git add assets
git commit -m 'adding assets folder'

ポジティブではありませんが、core.worktreeへのパスは絶対でなければなりません。

13
braitsch

私はあなたがすべてのリビジョンのすべてのファイルを含むように履歴を書き直すつもりだったと思いますまるでそれらがルートではなくサブディレクトリwebroot /にあったかのように

Git filter-branchのマンページに答えがあります。ここでは、既存のすべての参照(ブランチ)とタグを書き換える改良版です。

time git filter-branch --index-filter 'git ls-files -s |
         sed "s-\t\"*-&webroot/-" |
         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

これがインデックス専用の操作になるように注意が払われているため、大きなリポジトリでもプロセスが高速に実行されます。 (満足したら)元の参照(.git/refs/original/*)を削除し、リポジトリを再パックして古いツリーオブジェクトを失うことを忘れないでください。

9
sehe

コミットは、gitリポジトリ内に保存されている「webroot」フォルダーにローカルに関連付けられていません。

Webrootディレクトリを削除するだけで、新しい場所「/ projectディレクトリ」にあるリポジトリを再チェックアウトし、assetsディレクトリを追加してコミットできます。

rm -Rf webroot
git clone path-to-repo
git add assets 
git commit -m "Added assets directory"
git Push
5
Nick

次のコマンドは、Git履歴を書き換えます。内容がwebrootにあるかのように見えます。通常、複数の人がレポで作業している場合、履歴の書き換えは面倒です。単独で作業しているので、問題ないはずです。

git filter-branch --index-filter '
    git read-tree --prefix="webroot/" $GIT_COMMIT && \
    git ls-files \
      | sed "s/\/.*//" \
      | sort \
      | uniq \
      | grep -v "^webroot" \
      | xargs -L1 git rm -r --cached > /dev/null'
0
Lars Schneider