簡単な方法™</h1>
これは非常に一般的で便利な方法であるため、Git の大君主はこれを非常に簡単にしましたが、Git の新しいバージョン (>= 1.7.11 2012 年 5 月) を使用する必要があります。最新の Git のインストール方法については、付録を参照してください。また、以下のウォークスルーに実際の例があります。
古いリポジトリを準備する
cd <big-repo>
git subtree split -P <name-of-folder> -b <name-of-new-branch>
注: <name-of-folder>
先頭または末尾の文字を含めてはなりません。たとえば、という名前のフォルダーは、としてsubproject
渡す必要があります。subproject
./subproject/
Windows ユーザーへの注意:フォルダーの深さが 1 を超える場合は、<name-of-folder>
*nix スタイルのフォルダー セパレーター (/) が必要です。たとえば、という名前のフォルダーを次のpath1\path2\subproject
ように渡す必要があります。path1/path2/subproject
新しいレポを作成する
mkdir ~/<new-repo> && cd ~/<new-repo>
git init
git pull </path/to/big-repo> <name-of-new-branch>
新しいレポを GitHub などにリンクする
git remote add origin <git@github.com:user/new-repo.git>
git push -u origin master
必要に応じ<big-repo>
て内部をクリーンアップ
git rm -rf <name-of-folder>
注: これにより、すべての履歴参照がリポジトリに残ります。実際にパスワードをコミットしたことが心配な場合、またはフォルダーのファイル サイズを小さくする必要がある場合は、以下の付録を参照してください。.git
ウォークスルー
これらは上記と同じ手順ですが、使用する代わりに私のリポジトリの正確な手順に従います<meta-named-things>
。
ノードに JavaScript ブラウザー モジュールを実装するためのプロジェクトを次に示します。
tree ~/node-browser-compat
node-browser-compat
├── ArrayBuffer
├── Audio
├── Blob
├── FormData
├── atob
├── btoa
├── location
└── navigator
btoa
単一のフォルダーを別の Git リポジトリに分割したい
cd ~/node-browser-compat/
git subtree split -P btoa -b btoa-only
btoa-only
のコミットのみを持つ新しいブランチ がありbtoa
、新しいリポジトリを作成したいと考えています。
mkdir ~/btoa/ && cd ~/btoa/
git init
git pull ~/node-browser-compat btoa-only
次に、GitHub や Bitbucket などで新しいリポジトリを作成し、それをorigin
git remote add origin git@github.com:node-browser-compat/btoa.git
git push -u origin master
ハッピーデイ!
注:README.md
、.gitignore
およびを使用してリポジトリを作成した場合は、LICENSE
最初にプルする必要があります。
git pull origin master
git push origin master
最後に、より大きなレポからフォルダーを削除します
git rm -rf btoa
付録
macOS 上の最新の Git
Homebrewを使用して Git の最新バージョンを取得するには:
brew install git
Ubuntu の最新の Git
sudo apt-get update
sudo apt-get install git
git --version
それでもうまくいかない場合 (非常に古いバージョンの Ubuntu を使用している場合)、試してください。
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git
それでもうまくいかない場合は、試してください
sudo chmod +x /usr/share/doc/git/contrib/subtree/git-subtree.sh
sudo ln -s \
/usr/share/doc/git/contrib/subtree/git-subtree.sh \
/usr/lib/git-core/git-subtree
コメントのrui.araujoに感謝します。
履歴を消去する
デフォルトでは、Git からファイルを削除しても実際には削除されません。ファイルがもう存在しないことをコミットするだけです。過去の参照を実際に削除したい場合 (つまり、パスワードをコミットした場合)、次のようにする必要があります。
git filter-branch --prune-empty --tree-filter 'rm -rf <name-of-folder>' HEAD
その後、ファイルまたはフォルダーが Git 履歴にまったく表示されなくなったことを確認できます。
git log -- <name-of-folder> # should show nothing
ただし、削除を GitHubなどに「プッシュ」することはできません。試してみると、エラーが発生し、git pull
できるようになる前にエラーが発生します。git push
その後、履歴にすべてが含まれている状態に戻ります。
そのため、「オリジン」から履歴を削除する場合 (つまり、GitHub や Bitbucket などから履歴を削除する場合) は、リポジトリを削除し、プルーニングされたリポジトリのコピーを再度プッシュする必要があります。しかし、待ってください - まだまだあります! - パスワードなどを削除することを本当に心配している場合は、バックアップを削除する必要があります (以下を参照)。
小型.git
化
前述の履歴の削除コマンドは、まだバックアップ ファイルの束を残しています。なぜなら、Git は非常に親切で、誤ってリポジトリを台無しにしないように手助けしてくれるからです。孤立したファイルは最終的に数日から数か月かけて削除されますが、意図しないものを誤って削除したことに気付いた場合に備えて、しばらくの間そこに残ります.
したがって、本当にゴミ箱を空にしてレポのクローン サイズを縮小したい場合は、次の非常に奇妙なことをすべて実行する必要があります。
rm -rf .git/refs/original/ && \
git reflog expire --all && \
git gc --aggressive --prune=now
git reflog expire --all --expire-unreachable=0
git repack -A -d
git prune
とはいえ、必要があることがわかっている場合を除き、これらの手順を実行しないことをお勧めします。リポジトリをプッシュしても、バックアップ ファイルのクローンは作成されません。ローカル コピーにあるだけです。
クレジット