web-dev-qa-db-ja.com

gitフォルダをサブモジュールに遡及的に変換しますか?

かなりの場合、ある種のプロジェクトを作成していると、しばらくすると、プロジェクトの一部のコンポーネントがスタンドアロンコンポーネント(おそらくライブラリ)として実際に役立つことが明らかになります。早い段階からそのアイデアを持っているなら、そのコードの大部分がそれ自身のフォルダーにある可能性がかなりあります。

Gitプロジェクトのサブディレクトリの1つをサブモジュールに変換する方法はありますか?理想的には、そのディレクトリ内のすべてのコードが親プロジェクトから削除され、サブモジュールプロジェクトが適切な履歴とともにその場所に追加され、すべての親プロジェクトコミットが正しいサブモジュールコミットを指すようになります。

100
naught101

サブディレクトリを独自のリポジトリに分離するには、元のリポジトリのクローンでfilter-branchを使用します。

git clone <your_project> <your_submodule>
cd <your_submodule>
git filter-branch --subdirectory-filter 'path/to/your/submodule' --Prune-empty -- --all

元のディレクトリを削除し、サブモジュールを親プロジェクトに追加するだけです。

77
knittl

最初に、dirをサブモジュールとなるフォルダーに変更します。次に:

git init
git remote add Origin repourl
git add .
git commit -am'first commit in submodule'
git Push -u Origin master
cd ..
rm -rf folder wich will be a submodule
git commit -am'deleting folder'
git submodule add repourl folder wich will be a submodule
git commit -am'adding submodule'
14
zednight

私はこれが古いスレッドであることを知っていますが、ここでの答えは他のブランチの関連するコミットをすべてつぶします。

これらの余分なブランチとコミットをすべてクローンして保持する簡単な方法:

1-このgitエイリアスがあることを確認してください

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'

2-リモートのクローン、すべてのブランチのプル、リモートの変更、ディレクトリのフィルタリング、プッシュ

git clone [email protected]:user/existing-repo.git new-repo
cd new-repo
git clone-branches
git remote rm Origin
git remote add Origin [email protected]:user/new-repo.git
git remote -v
git filter-branch --subdirectory-filter my_directory/ -- --all
git Push --all
git Push --tags
7
oodavid

実行できますが、簡単ではありません。 git filter-branchsubdirectory、およびsubmoduleを検索する場合、プロセスにはある程度の評価があります。基本的に、プロジェクトの2つのクローンを作成し、git filter-branchを使用して、一方のサブディレクトリ以外のすべてを削除し、他方のサブディレクトリのみを削除する必要があります。次に、2番目のリポジトリを最初のリポジトリのサブモジュールとして確立できます。

1
twalberg