Легкий путь и торговля;
Оказывается, что это такая распространенная и полезная практика, что повелители git сделали это действительно легко, но вам нужно иметь более новую версию git (> = 1.7.11, май 2012). См. приложение о том, как установить последнюю версию git. Кроме того, реальный пример в пошаговом руководстве ниже.
Подготовить старый репо
pushd <big-repo>
git subtree split -P <name-of-folder> -b <name-of-new-branch>
popd
Примечание: <name-of-folder>
НЕ должно содержать начальных или конечных символов. Например, папка с именем subproject
ДОЛЖНА передаваться как subproject
, НЕ ./subproject/
Примечание для пользователей Windows: , если глубина вашей папки> 1, <name-of-folder>
должен иметь разделитель папок в стиле * nix (/). Например, папка с именем path1\path2\subproject
ДОЛЖНА быть передана как path1/path2/subproject
Создать новый репо
mkdir <new-repo>
pushd <new-repo>
git init
git pull </path/to/big-repo> <name-of-new-branch>
Свяжите новый репозиторий с Github или где-либо еще
git remote add origin <git@github.com:my-user/new-repo.git>
git push origin -u master
Очистка, при желании
popd # get out of <new-repo>
pushd <big-repo>
git rm -rf <name-of-folder>
Примечание : это оставляет все исторические ссылки в репозитории. См. Приложение ниже, если вы действительно хотите ввести пароль или вам нужно уменьшить размер файла. вашей папки .git
.
...
Пошаговое
Это те же шаги, что и выше , но следуйте моим точным шагам для моего хранилища вместо использования <meta-named-things>
.
Вот мой проект по реализации модулей браузера JavaScript в узле:
tree ~/Code/node-browser-compat
node-browser-compat
├── ArrayBuffer
├── Audio
├── Blob
├── FormData
├── atob
├── btoa
├── location
└── navigator
Я хочу разбить одну папку, btoa
, на отдельный репозиторий git
pushd ~/Code/node-browser-compat/
git subtree split -P btoa -b btoa-only
popd
Теперь у меня есть новая ветвь, btoa-only
, которая имеет коммиты только для btoa
, и я хочу создать новый репозиторий.
mkdir ~/Code/btoa/
pushd ~/Code/btoa/
git init
git pull ~/Code/node-browser-compat btoa-only
Далее я создаю новый репозиторий на Github или bitbucket, или что-то еще, и добавляю это origin
(кстати, «origin» - это просто соглашение, а не часть команды - вы можете назвать его «remote-server») или как угодно)
git remote add origin git@github.com:node-browser-compat/btoa.git
git push origin -u master
С Днем Рождения!
Примечание: Если вы создали репо с README.md
, .gitignore
и LICENSE
, вам нужно будет сначала потянуть:
git pull origin -u master
git push origin -u master
Наконец, я хочу удалить папку из большего репо
git rm -rf btoa
...
Приложение
Последний Git на OS X
Чтобы получить последнюю версию git:
brew install git
Чтобы получить кофе для OS X:
http://brew.sh
Последний Git на Ubuntu
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, а просто подтверждает, что их больше нет. Если вы действительно хотите удалить исторические ссылки (т. Е. У вас есть подтвержденный пароль), вам нужно сделать следующее:
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
Тем не менее, я бы порекомендовал не выполнять эти шаги, если вы не знаете, что вам нужно - на тот случай, если вы удалили неправильный подкаталог, понимаете? Файлы резервных копий не должны быть клонированы, когда вы запускаете репозиторий, они просто будут в вашей локальной копии.
Credit