gitバージョンライブラリの分割とsubtreeの使用方法

5460 ワード

gitバージョンライブラリ分割
原文住所:https://segmentfault.com/a/1190000002548731
プログラマーが一番爽やかなことは何ですか.削除削除!すべてのプロジェクトはもともとスリムで、時間が長くなるとどうしてもいくつかのますます大きくなって、どのように見てどのように不快で、1つの字、取り外します!今日はGit倉庫を分割することについて話します.
この字を分解するには、big-projectという倉庫があります.カタログは以下の通りです.
big-project├-codes-a├-codes-b└-codes-eiyoはcodes-eiyoを独立した倉庫にしたい場合がある.codes-eiyoをクリーンアップし、残りのコードだけを倉庫に残したい場合があります.この2つのことをそれぞれ見てみましょう.
サブディレクトリを独立倉庫に分割する以前はfilter-branchで実現していたが、この需要はあまりにも一般的で、git-subtreeを統合した人がいたが、その後......subtreeがGitに統合された.
これがあの大きな倉庫big-projectです
$ git clone git@github.com:tom/big-project.git
$ cd big-project

すべてのcodes-eiyoディレクトリの下の関連コミットを新しいブランチeiyoに整理
$ git subtree split -P codes-eiyo -b eiyo

新しいディレクトリを追加しgitウェアハウスに初期化
$ mkdir ../eiyo
$ cd ../eiyo
$ git init

古い倉庫のeiyoブランチを現在のmasterブランチに引き寄せる
$ git pull ../big-project eiyo

サブディレクトリのすべてのコンテンツをクリアし、これを記録するには、万能のfilter-branchを使用します.
それともあの倉庫big-project
$ git clone git@github.com:tom/big-project.git
$ cd big-project
masterブランチのcodes-eiyoディレクトリに関連するすべての痕跡をクリーンアップ
$ git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch codes-eiyo" --prune-empty master

新しいディレクトリを追加しgitウェアハウスに初期化
$ mkdir ../big-project-fresh
$ cd ../big-project-fresh
$ git init
big-projectmaster分岐(新しい倉庫へのmaster分岐)を引く
$ git pull ../big-project master
Before & After

count-objectsコマンドで新旧倉庫の違いを比較することを覚えておいてください(さっぱり):
$ git count-objects -vH

これから新しい遠端倉庫に送るなんて勝手だよ~
$ git remote add origin git://github.com:tom/fresh-project.git
$ git push origin -u master

git subtreeの使い方
シーンの操作
例えば、プロジェクトGameにはサブディレクトリAIがある.GameとAIはそれぞれ独立したgitプロジェクトで、別々にメンテナンスすることができます.貼り付けコードの直接コピーを避けるために、GameのAIサブディレクトリとAIのgitプロジェクトを関連付けることを望んでいます.3つの意味があります.
AIサブディレクトリはAIのgit項目を用いて埋め込まれ,内容は一貫している.AIのgitプロジェクトコードが更新された場合、Gameプロジェクトに更新されたAIサブディレクトリを引き出すことができます.逆に,GameプロジェクトのAIサブディレクトリが変更された場合,これらの変更をAIのgitプロジェクトにプッシュすることもできる.git subtreeで上記のニーズを簡単に満たすことができます.
git subtreeの使い方
第1段の3つのニーズについて、具体的なコマンドをそれぞれ説明します.
1.サブディレクトリを初めて追加しgitプロジェクトとの関連付けを確立する
関連付けには2つのコマンドがあります.
構文:git remote add-f
説明:fは、リモートウェアハウスを追加した後、直ちにfetchを実行することを意味します.
構文:git subtree add–prefix=–squash
解釈:–squashはsubtreeの変更をcommitに統合することを意味し、サブプロジェクトの完全な履歴を引き出す必要はありません.–prefix以降の=等号はスペースでも使用できます.
$git remote add -f ai https://github.com/aoxu/ai.git  
$git subtree add --prefix=ai ai master --squash

2.リモート・ウェアハウスからのサブディレクトリの更新
サブディレクトリの更新には2つのコマンドがあります.
構文:git fetch
構文:git subtree pull–prefix=–squash
$git fetch ai master  
$git subtree pull --prefix=ai ai --squash

3.サブディレクトリpushからリモートウェアハウスへ(書き込み権限があることを確認)
サブディレクトリの変更をプッシュするには1つのコマンドがあります.
構文:git subtree push–prefix=分岐
$git subtree push --prefix=ai ai master