Как извлечь подкаталог мерзавца и сделать подмодуль из него?

При разработке на Kotlin вы должны добавить следующие строки рядом с annotationProcessor их аналогами:

kapt 'com.google.dagger:dagger-android-processor:2.15'
kapt 'com.google.dagger:dagger-compiler:2.15'

и добавить apply plugin: 'kotlin-kapt' в начале того же файла.

Этот раздел выглядит для меня так:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt' // <- Add this line
apply plugin: 'io.fabric'
113
задан Cœur 25 July 2018 в 02:05
поделиться

4 ответа

Оформление заказа git filter-branch .

Раздел Примеры на странице руководства показывает, как извлечь подкаталог в его собственный проект, сохраняя при этом всю его историю и удаляя историю других файлов / каталогов (именно то, что вы ' мы ищем).

Чтобы переписать репозиторий, чтобы он выглядел так, как если бы foodir / был его корнем проекта, и отбросить всю остальную историю:

  git filter-branch --subdirectory-filter foodir - - --все

Таким образом, вы можете, например, превратить подкаталог библиотеки в собственный репозиторий.
Обратите внимание на - , который отделяет параметры filter-branch от параметров редакции, и - all , чтобы перезаписать все ветви и теги.

38
ответ дан 24 November 2019 в 02:43
поделиться

Один из способов сделать это наоборот - удалить все, кроме файла, который вы хотите сохранить.

Как правило, сделайте копию репозитория, затем используйте git filter-branch , чтобы удалить все, кроме файлов / папок, которые вы хотите сохранить.

Например, у меня есть проект, из которого я хочу извлечь файл tvnamer.py в новый репозиторий:

git filter-branch --tree-filter 'for f in *; do if [ $f != "tvnamer.py" ]; then rm -rf $f; fi; done' HEAD

, который использует git filter-branch --tree-filter для прохождения каждого коммита, выполнения команды и повторного подтверждения полученного содержимого каталогов. Это чрезвычайно разрушительно (так что вы должны делать это только с копией вашего репозитория!) И может занять некоторое время (около 1 минуты для репозитория с 300 коммитами и примерно 20 файлами)

Приведенная выше команда просто запускает следующее shell-скрипт для каждой ревизии, которую вы d, конечно, придется изменить (чтобы исключить ваш подкаталог вместо tvnamer.py ):

for f in *; do
    if [ $f != "tvnamer.py" ]; then
        rm -rf $f;
    fi;
done

Самая большая очевидная проблема заключается в том, что он оставляет все сообщения фиксации, даже если они не связаны с остальными файл. Сценарий git-remove-empty-commits исправляет это ..

git filter-branch --commit-filter 'if [ z$1 = z`git rev-parse $3^{tree}` ]; then skip_commit "$@"; else git commit-tree "$@"; fi'

Вам нужно снова использовать аргумент -f force run filter-branch с что-нибудь в refs / original / (которое в основном является резервной копией)

Конечно, это никогда не будет идеальным, например, если в ваших сообщениях о фиксации упоминаются другие файлы, но это примерно настолько близко, что позволяет git current (как насколько мне известно).

Опять же, запускайте это только на копии вашего репозитория! - но в целом, чтобы удалить все файлы, кроме thisismyfilename.txt:

git filter-branch --tree-filter 'for f in *; do if [ $f != "thisismyfilename.txt" ]; then rm -rf $f; fi; done' HEAD
git filter-branch -f --commit-filter 'if [ z$1 = z`git rev-parse $3^{tree}` ]; then skip_commit "$@"; else git commit-tree "$@"; fi'
13
ответ дан 24 November 2019 в 02:43
поделиться

Если вы хотите перенести какое-то подмножество файлов в новый репозиторий, но сохранить историю, в итоге вы получите совершенно новую историю. В основном это будет работать следующим образом:

  1. Создайте новый репозиторий.
  2. Для каждой ревизии вашего старого репозитория объедините изменения вашего модуля в новый репозиторий. Это создаст «копию» вашей существующей истории проекта.

Это должно быть довольно просто автоматизировать, если вы не против написать небольшой, но сложный сценарий. Прямолинейно, да, но также и болезненно. В прошлом люди переписывали историю в Git, вы можете выполнить поиск по этому запросу.

В качестве альтернативы: клонировать репозиторий и удалить документ в клоне, удалить приложение в оригинале. Это займет одну минуту, это гарантированно сработает, и вы можете вернуться к более важным вещам, чем попытки очистить историю git. И не беспокойтесь о пространстве на жестком диске, занятом избыточными копиями истории.

3
ответ дан 24 November 2019 в 02:43
поделиться

В настоящее время есть гораздо более простой способ сделать это, чем вручную использовать git filter-branch: git subtree

Установка

ПРИМЕЧАНИЕ git-subtree теперь является частью git (если вы устанавливаете contrib) начиная с 1.7.11, так что у вас, возможно, уже есть он установлен. Вы можете проверить, выполнив git subtree .


Чтобы установить git-subtree из источника (для более старых версий git):

git clone https://github.com/apenwarr/git-subtree.git

cd git-subtree
sudo rsync -a ./git-subtree.sh /usr/local/bin/git-subtree

Или, если вам нужны страницы руководства и все

make doc
make install

Использование

Разделите больший на меньшие части:

# Go into the project root
cd ~/my-project

# Create a branch which only contains commits for the children of 'foo'
git subtree split --prefix=foo --branch=foo-only

# Remove 'foo' from the project
git rm -rf ./foo

# Create a git repo for 'foo' (assuming we already created it on github)
mkdir foo
pushd foo
git init
git remote add origin git@github.com:my-user/new-project.git
git pull ../ foo-only
git push origin -u master
popd

# Add 'foo' as a git submodule to `my-project`
git submodule add git@github.com:my-user/new-project.git foo

Для получения подробной документации (справочная страница), пожалуйста, прочтите git-subtree.txt .

117
ответ дан 24 November 2019 в 02:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: