Легкий путь ™
Оказывается, это настолько распространенная и полезная практика, что повелители Git упростили ее, но у вас должна быть более новая версия Git (›= 1.7.11 мая 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 <[email protected]: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 [email protected]: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
Приложение
Последний Git для macOS
Чтобы получить последнюю версию Git с помощью Homebrew:
brew install git
Последний 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 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
Тем не менее, я бы рекомендовал не выполнять эти шаги, если вы не знаете, что вам нужно - на всякий случай, если вы удалили неправильный подкаталог, понимаете? Файлы резервных копий не должны клонироваться при отправке репозитория, они просто будут в вашей локальной копии.
Кредит
person
coolaj86
schedule
25.07.2013
git filter-branch
см. Мой ответ ниже. - person jeremyjjbrown   schedule 20.08.2014