Easy Way™
これは非常に一般的で有用な慣行であり、Gitのオーバーロードによって本当に簡単になりましたが、新しいバージョンのGit(> = 1.7.11 May 2012)が必要です。最新の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
、履歴にすべてが戻ってきます。
したがって、「origin」から履歴を削除する場合、つまり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
とはいえ、必要なことがわかっている場合を除いて、これらの手順を実行しないことをお勧めします-間違ったサブディレクトリを削除した場合に備えて、知っていますか?バックアップファイルは、レポをプッシュするときに複製されるべきではありません。ローカルコピーにあるだけです。
クレジット
git filter-branch
ことですが、以下の私の回答を参照してください。