-
まとめた目的
- プロジェクトのルートディレクトリにsubtree先を展開できないかなーという話を検証したので、その記録
subtreedDir/ /A /B とかがあるとき、それをsubtreeとして呼び出す、childプロジェクトがあるとする。このとき、 child/ /subtreedDir /A /B じゃなくて、 child/ /A /B みたく、階層が深くなるの嫌だから、subtreedDirの中身だけそのまま持って来たいよね、という話を検証した。
-
subtreeとsubmoduleの違い
- subtreeは別ブランチ切るようなもので、もとのブランチにコミットできる
- submoduleはリポジトリをただただ参照するイメージ。
-
subtree-mergeとgit-subtreeの違い
-
まず、そんな違いはない。しいていうならprefix(subtreeから引っ張ってきたファイルの置き場所)の指定くらい。
- Atlassianの資料
- ここだと「何らかの理由で git subtree コマンドが利用できない場合であっても、マージ戦略を利用することは可能です。」程度にしか違いが書かれていない
- たぶん、git-subtreeの方が、どこにsubtreeの内容があるのか意識しなくて済む、とかだと思う。
- Atlassianの資料
-
git-subtreeコマンド
- 公式ドキュメント
- prefixにカレントディレクトリを設定できない
-
subtree-merge(戦略というかパターンというか。とりあえずコマンドではない。)
- 公式ドキュメント
- ほかにもこんな感じでやり方が書かれてる
- 詳細な手順
-
- remoteのブランチをfetchしてくる
- �2. read-treeを使って、異なるツリーの中身を今いる場所に引っ張ってくる。
-
-
git remote add ansible [email protected]:timakin/timakin_vm_ansible.git
git fetch ansible
git branch ansible ansible/master
# パターン1(展開成功ケース)
git read-tree --prefix=/ -u ansible(できる。けど後述のパターン2で変更反映できない)
# パターン2(展開失敗ケース)
git subtree add --prefix=. ansible master(prefix already exists error)
# subtree-mergeをmasterに反映
git add .
git commit -am 'test merge of subtree'
# パターン1(失敗:subtree mergeパターン)
git checkout ansible
git pull
git checkout master
git diff-tree -p ansible
# subtree参照先の変更を反映(失敗:subtree以外のファイルが全部消える)
git merge -s subtree ansible master
git pull -s subtree ansible master
# パターン2(�失敗:git-subtreeパターン)
# subtree参照先の変更を反映(微妙)
git subtree pull -P . ansible master(conflictする。解消すればOKだが、、)
# subtree参照先にローカルの変更を反映(失敗)
git subtree push -P . ansible master(pushできない。おそらくsubtreeのリポジトリに本来ふくまれないファイル(ルートディレクトリの他のファイル)がpushされようとしてるから)
git remote add ansible [email protected]:timakin/timakin_vm_ansible.git
git subtree add -P ansible/ ansible master
git subtree pull -P ansible/ ansible master
git subtree push -P ansible/ ansible master