Как удалить группу папок из репозитория git и их историю, но сохранить историю каждой другой папки [duplicate]

Вы можете нарисовать эту часть по частям с помощью функций drawLine() и drawArc() из Canvas.

1612
задан Nick Volynkin 1 August 2016 в 08:25
поделиться

17 ответов

Обновление: этот процесс настолько распространен, что команда git сделала это намного проще с помощью нового инструмента git subtree. См. Здесь: Подкаталог Detach (перемещение) в отдельный репозиторий Git


Вы хотите клонировать ваш репозиторий, а затем использовать git filter-branch для отметки всего, кроме подкаталога, который вы хотите

    1. Чтобы клонировать ваш локальный репозиторий:
      git clone /XYZ /ABC
      
      (Примечание: репозиторий будет клонирован с использованием жестких ссылок, но это не проблема, поскольку жесткий
    2. Теперь сохраним интересные ветви, которые мы также хотим переписать, а затем удалить начало координат, чтобы избежать нажатия туда и чтобы убедиться, что старые коммиты не будут ссылаться на источник:
      cd /ABC
      for i in branch1 br2 br3; do git branch -t $i origin/$i; done
      git remote rm origin
      
      или для всех удаленных ветвей:
      cd /ABC
      for i in $(git branch -r | sed "s/.*origin\///"); do git branch -t $i origin/$i; done
      git remote rm origin
      
    3. Теперь вы можете также удалить теги, которые не имеют никакого отношения к подпроекту; вы также можете это сделать позже, но вам может потребоваться сократить время репо. Я не сделал этого и получил WARNING: Ref 'refs/tags/v0.1' is unchanged для всех тегов (поскольку все они были не связаны с подпроектом); Кроме того, после удаления таких тегов больше места будет исправлено. По-видимому, git filter-branch должен иметь возможность переписывать другие теги, но я не мог проверить это. Если вы хотите удалить все теги, используйте git tag -l | xargs git tag -d.
    4. Затем используйте ветвь filter и reset, чтобы исключить другие файлы, чтобы их можно было обрезать. Давайте также добавим --tag-name-filter cat --prune-empty, чтобы удалить пустые коммиты и переписать теги (обратите внимание, что это должно будет удалить их подпись):
      git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter ABC -- --all
      
      или, альтернативно, только переписать ветвь HEAD и игнорировать теги и другие ветви:
      git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter ABC HEAD
      
    5. Затем удалите резервные блокировки, чтобы пространство было действительно исправлено (хотя теперь операция разрушительна)
      git reset --hard
      git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
      git reflog expire --expire=now --all
      git gc --aggressive --prune=now
      
      , и теперь у вас есть локальный репозиторий git подкаталога ABC со всей сохраненной историей.

    Примечание. Для большинства применений git filter-branch действительно должен иметь добавленный параметр -- --all. Да, это действительно - space - all. Это должны быть последние параметры для команды. Поскольку Мэтли обнаружил, это удерживает ветви проекта и теги, включенные в новое репо.

    Изменить: различные предложения из комментариев ниже были включены, чтобы убедиться, например, что хранилище фактически сокращено (что не было всегда раньше).

1156
ответ дан 17 revs, 12 users 35% 20 August 2018 в 12:07
поделиться
  • 1
    Очень хороший ответ. Благодаря! И чтобы действительно получить именно то, что я хотел, я добавил «-» all & quot; к команде filter-branch. – matli 12 December 2008 в 10:17
  • 2
    Зачем вам нужно --no-hardlinks? Удаление одного жесткого диска не повлияет на другой файл. Объекты Git тоже неизменяемы. Только если вы измените права владельца / файла, вам понадобится --no-hardlinks. – vdboor 1 February 2010 в 10:58
  • 3
    Дополнительным шагом, который я бы рекомендовал, было бы «git remote rm origin». Это не помешает вернуться в исходный репозиторий, если я не ошибаюсь. – Tom 5 April 2010 в 20:51
  • 4
    Другой командой для добавления в filter-branch является --prune-empty, чтобы удалить теперь - пустые коммиты. – Seth Johnson 12 September 2011 в 03:31
  • 5
    Как и Павел, мне не нужны теги проекта в моем новом репо, поэтому я не использовал -- --all. Я также выполнил git remote rm origin и git tag -l | xargs git tag -d перед командой git filter-branch. Это уменьшило мой каталог .git с 60 до 300K. Обратите внимание, что мне нужно было запустить обе эти команды, чтобы получить уменьшение размера. – saltycrane 17 November 2011 в 23:18

Похоже, что большинство (все?) ответов здесь опираются на некоторую форму git filter-branch --subdirectory-filter и ее ilk. Это может работать «в большинстве случаев», однако для некоторых случаев, например, когда вы переименовали папку, например:

 ABC/
    /move_this_dir # did some work here, then renamed it to

ABC/
    /move_this_dir_renamed

Если вы используете обычный стиль git-фильтра для извлечения «move_me_renamed», вы будете потерять историю изменений файла, которая произошла со спины, когда она была первоначально move_this_dir ( ref ).

Таким образом, кажется, что единственный способ действительно сохранить все история (если ваш случай подобен этому), по сути, копировать репозиторий (создать новое репо, установить его как начало), затем уничтожить все остальное и переименовать подкаталог родительскому элементу следующим образом:

  1. Локализовать проект с несколькими модулями локально
  2. Ветви - проверить, что там есть: git branch -a
  3. Выполните проверку каждой ветви, которая будет включена в разделение для получения локальной копии на вашей рабочей станции: git checkout --track origin/branchABC
  4. Сделайте копию в новом каталоге: cp -r oldmultimod simple
  5. Перейдите в новую копию проекта: cd simple
  6. Избавьтесь от других модулей, которые не нужны в этом проекте:
  7. git rm otherModule1 other2 other3
  8. Теперь только subdir целевого модуля остается
  9. Избавиться от модуля subdir модуля, чтобы корень модуля стал новым корнем проекта
  10. git mv moduleSubdir1/* .
  11. Удалить реликвий subdir : rmdir moduleSubdir1
  12. Проверьте изменения в любой точке: git status
  13. Создайте новый репозиторий git и скопируйте его URL, чтобы указать на него этот проект:
  14. git remote set-url origin http://mygithost:8080/git/our-splitted-module-repo
  15. Убедитесь, что это хорошо: git remote -v
  16. Нажмите изменения до удаленного репо: git push
  17. Перейдите к удаленному репо и проверьте его там
  18. Повторите его для любой другой ветки: git checkout branch2

Это следует за github doc «Разделение вложенной папки в новый репозиторий « шаги 6-11, чтобы подтолкнуть модуль к новому репо.

Это не сохранит ваше место в вашей папке .git, но оно сохранит всю историю изменений для этих файлов даже переименования. И это может не стоить того, если нет «большой» истории, потерянной и т. Д. Но по крайней мере вам гарантировано не потерять более старые коммиты!

5
ответ дан Adam 20 August 2018 в 12:07
поделиться
  • 1
    Найди иглу в стоге сена! Теперь я могу сохранить ALL мою историю фиксации. – Adam 30 October 2017 в 18:19

Используйте эту команду фильтра, чтобы удалить подкаталог, сохраняя ваши теги и ветви:

git filter-branch --index-filter \
"git rm -r -f --cached --ignore-unmatch DIR" --prune-empty \
--tag-name-filter cat -- --all
3
ответ дан cmcginty 20 August 2018 в 12:07
поделиться

Простой способ

  1. установить git splits . Я создал его как расширение git, основанное на решении jkeating .
  2. Разделите каталоги на локальную ветвь #change into your repo's directory cd /path/to/repo #checkout the branch git checkout XYZ
    #split multiple directories into new branch XYZ git splits -b XYZ XY1 XY2
  3. Создайте пустой репо где-нибудь. Предположим, мы создали пустое репо под названием xyz на GitHub, у которого есть путь: git@github.com:simpliwp/xyz.git
  4. Нажмите на новое репо. #add a new remote origin for the empty repo so we can push to the empty repo on GitHub git remote add origin_xyz git@github.com:simpliwp/xyz.git #push the branch to the empty repo's master branch git push origin_xyz XYZ:master
  5. Клонирование вновь созданного удаленного репо в новый локальный каталог #change current directory out of the old repo cd /path/to/where/you/want/the/new/local/repo #clone the remote repo you just pushed to git clone git@github.com:simpliwp/xyz.git
1129
ответ дан Community 20 August 2018 в 12:07
поделиться
  • 1
    сделайте это git filter-branch --index-filter "git rm -r -f --cached --ignore-unmatch ABC" --prune-empty HEAD, и он будет намного быстрее. индексный фильтр работает с индексом, тогда как древовидный фильтр должен проверять и выполнять все для каждой фиксации . – fmarc 17 September 2009 в 20:58
  • 2
    в некоторых случаях испортить историю репозитория XYZ - это избыток ... просто простая «rm -rf ABC; git rm -r ABC; git commit -m'extracted ABC в свое собственное репо '& quot; будет работать лучше для большинства людей. – Evgeny 29 October 2010 в 00:24
  • 3
    Вероятно, вы захотите использовать -f (force) для этой команды, если вы делаете это более одного раза, например, чтобы удалить два каталога после их разделения. В противном случае вы получите & quot; Не можете создать новую резервную копию. & Quot; – Brian Carlton 18 April 2011 в 18:59
  • 4
    Если вы выполняете метод --index-filter, вы также можете сделать это git rm -q -r -f, чтобы каждый вызов не печатал строку для каждого удаляемого файла. – Eric Naeseth 12 October 2011 в 20:55
  • 5
    git-subtree теперь является частью Git, хотя он находится в дереве contrib, поэтому не всегда устанавливается по умолчанию. Я знаю, что он установлен формулой Homebrew git, но без его справочной страницы. Таким образом, apenwarr называет свою версию устаревшей. – echristopherson 10 May 2013 в 17:04
  • 6
    git subtree по-прежнему входит в папку «contrib» и по умолчанию не установлен на всех дистрибутивах. github.com/git/git/blob/master/contrib/subtree – onionjake 2 August 2013 в 15:06
  • 7
    @krlmlr 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 Чтобы активировать Ubuntu 13.04 – rui.araujo 26 August 2013 в 07:39
  • 8
    Если вы ввели пароль в общедоступный репозиторий, вы должны изменить пароль, а не пытаться удалить его из публичного репо и надеяться, что никто его не увидит. – Miles Rout 18 September 2013 в 04:43
  • 9
    Я предлагаю отредактировать ответ Павла, только потому, что Павел настолько тщателен. – Erik Aronesty 5 March 2014 в 17:38
  • 10
    это, похоже, создает новое репо с содержимым ABC/, но новое репо не содержит самой папки ABC/, как задал вопрос. Как бы вы это сделали? – woojoo666 8 October 2014 в 13:14
  • 11
    Преимущество этого метода по сравнению с «Легким путем» что пульт дистанционного управления уже настроен для нового репо, поэтому вы можете сразу добавить добавление поддерева. На самом деле этот способ мне кажется более легким (даже без git splits) – M.M 12 May 2015 в 05:58
  • 12
    Это решение не сохраняет историю. – Cœur 11 November 2015 в 03:06
  • 13
    Это сработало для меня с небольшими изменениями. Поскольку мои sub1 и sub2 папки не существовали с исходной версией, мне пришлось изменить сценарий --tree-filter следующим образом: "mkdir <name-of-folder>; if [ -d sub1 ]; then mv <sub1> <name-of-folder>/; fi". Для второй команды filter-branch я заменил & lt; sub1 & gt; с & lt; sub2 & gt ;, опустил создание & lt; имя-папки & gt ;, и включил -f после filter-branch, чтобы переопределить предупреждение существующей резервной копии. – pglezen 11 February 2016 в 20:38
  • 14
    Это не работает, если какой-либо из поддиреев изменился во время истории в git. Как это можно решить? – nietras 3 March 2016 в 13:06
  • 15
    @nietras см. ответ rogerdpack. Понадобился немного времени, чтобы найти его после прочтения и поглощения всей информации в этих других ответах. – Adam 30 October 2017 в 18:18
  • 16
    Подпишитесь на AndrewD для публикации этого решения. Я отклонил его репо, чтобы он работал на OSX ( github.com/ricardoespsanto/git-splits ), если это полезно для кого-то еще – ricardoespsanto 9 February 2018 в 14:33

Поместите это в свой gitconfig:

reduce-to-subfolder = !sh -c 'git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter cookbooks/unicorn HEAD && git reset --hard && git for-each-ref refs/original/ | cut -f 2 | xargs -n 1 git update-ref -d && git reflog expire --expire=now --all && git gc --aggressive --prune=now && git remote rm origin'
1
ответ дан grosser 20 August 2018 в 12:07
поделиться

Для чего это стоит, вот как использовать GitHub на машине Windows. Допустим, у вас есть клонированное репо, проживающее в C:\dir1. Структура каталогов выглядит так: C:\dir1\dir2\dir3. Каталог dir3 является тем, кем я хочу стать новым отдельным репо.

Github:

  1. Создайте новый репозиторий: MyTeam/mynewrepo

Bash Prompt:

  1. $ cd c:/Dir1
  2. $ git filter-branch --prune-empty --subdirectory-filter dir2/dir3 HEAD Возврат: Ref 'refs/heads/master' was rewritten (fyi: dir2 / dir3 чувствителен к регистру.)
  3. $ git remote add some_name git@github.com:MyTeam/mynewrepo.git git remote add origin etc. не работает, возвращается "remote origin already exists"
  4. $ git push --progress some_name master
4
ответ дан James Lawruk 20 August 2018 в 12:07
поделиться

Это уже не так сложно, вы можете просто использовать команду git filter-branch на клоне вашего репо, чтобы отбросить подкаталоги, которые вам не нужны, а затем нажать на новый пульт.

git filter-branch --prune-empty --subdirectory-filter <YOUR_SUBDIR_TO_KEEP> master
git push <MY_NEW_REMOTE_URL> -f .
21
ответ дан jeremyjjbrown 20 August 2018 в 12:07
поделиться
  • 1
    Это работало как прелесть. YOUR_SUBDIR в приведенном выше примере - это подкаталог, который вы хотите ХРАНИТЬ, все остальное будет удалено – J.T. Taylor 19 April 2015 в 06:18
  • 2
    Обновления на основе вашего комментария. – jeremyjjbrown 20 April 2015 в 18:43
  • 3
    Это не отвечает на вопрос. Из документов это говорит The result will contain that directory (and only that) as its project root., и действительно, это то, что вы получите, т. Е. Исходная структура проекта не сохраняется. – NicBright 2 June 2017 в 13:11
  • 4
    @NicBright Можете ли вы проиллюстрировать свою проблему с XYZ и ABC, как в вопросе, чтобы показать, что не так? – Adam 26 October 2017 в 16:02
  • 5
    @jeremyjjbrown можно повторно использовать клонированное репо и не использовать новое репо, т. е. мой вопрос здесь stackoverflow.com/questions/49269602/… – Qiulang 3 April 2018 в 12:34

Я обнаружил, что для правильного удаления старой истории из нового репозитория вам нужно сделать немного больше работы после шага filter-branch.

  1. Сделайте клон и фильтр:
    git clone --no-hardlinks foo bar; cd bar
    git filter-branch --subdirectory-filter subdir/you/want
    
  2. Удалите все ссылки на старую историю. «Происхождение» отслеживало ваш клон, а «оригинал» - это то, где фильтр-ветвь сохраняет старые вещи:
    git remote rm origin
    git update-ref -d refs/original/refs/heads/master
    git reflog expire --expire=now --all
    
  3. Даже сейчас ваша история может застрять в пакете, который fsck не будет трогают. Раздирайте его в клочья, создайте новый пакетный файл и удалите неиспользуемые объекты:
    git repack -ad
    

Существует объяснение этого в руководстве для фильтра ветвп .

94
ответ дан Josh Lee 20 August 2018 в 12:07
поделиться
  • 1
    Я думаю, что что-то вроде git gc --aggressive --prune=now все еще отсутствует, не так ли? – Albert 11 July 2012 в 21:14
  • 2
    @Albert Команда repack позаботится об этом, и не будет никаких свободных объектов. – Josh Lee 11 July 2012 в 21:57
  • 3
    просто перепачка не работала для меня, нужно было делать git gc – jsvnm 30 August 2012 в 12:56
  • 4
    да, git gc --aggressive --prune=now уменьшил большую часть нового репо – Tomek Wyderka 2 April 2013 в 10:01
  • 5
    Простой и элегантный. Благодаря! – Marco Pelegrini 29 August 2016 в 02:30

Оригинальный вопрос хочет, чтобы XYZ / ABC / (* файлы) стали ABC / ABC / (* файлами). После выполнения принятого ответа для моего собственного кода я заметил, что он фактически изменяет XYZ / ABC / (* файлы) в ABC / (* файлы). Страница man filter-branch даже говорит:

Результат будет содержать этот каталог (и только это) в качестве его корня проекта . "

Другими словами, он продвигает папку верхнего уровня «вверх» на один уровень. Это важное различие, потому что, например, в моей истории я переименовал папку верхнего уровня. Продвигая папки «вверх» на один уровень , git теряет непрерывность в commit, где я сделал переименование.

I lost contiuity after filter-branch [/g1]

Тогда мой ответ на вопрос состоит в том, чтобы сделать 2 копии репозитория и вручную удалите папку (ы), которую вы хотите сохранить в каждой странице. man-страница поддерживает меня следующим образом:

[...] избегать использования [этой команды], если достаточно простого синтаксиса для исправления вашей проблемы

11
ответ дан MM. 20 August 2018 в 12:07
поделиться
  • 1
    Мне нравится стиль этого графа. Могу ли я спросить, какой инструмент вы используете? – Slipp D. Thompson 30 March 2013 в 20:17
  • 2
    Башня для Mac. Мне это и вправду нравится. Это почти стоит переключиться на Mac для себя. – MM. 2 April 2013 в 22:02
  • 3
    Да, хотя в моем случае моя подпапка targetdir была переименована в какой-то момент, а git filter-branch просто назвала ее днем, удалив все коммиты, сделанные до переименования! Шокирующий, учитывая, насколько адепт Git отслеживает такие вещи и даже перемещает отдельные куски контента! – Jay Allen 31 May 2013 в 10:25
  • 4
    О, также, если кто-то окажется в одной лодке, вот команда, которую я использовал. Не забывайте, что git rm принимает несколько аргументов, поэтому нет причин запускать его для каждого файла / папки: BYEBYE="dir/subdir2 dir2 file1 dir/file2"; git filter-branch -f --index-filter "git rm -q -r -f --cached --ignore-unmatch $BYEBYE" --prune-empty -- --all – Jay Allen 31 May 2013 в 10:26

Правильный способ теперь следующий:

git filter-branch --prune-empty --subdirectory-filter FOLDER_NAME [first_branch] [another_branch]

GitHub теперь даже имеет малую статью о таких случаях.

Но обязательно клонируйте свое первоначальное репо, чтобы сначала отделить каталог (так как он удалит все файлы и другие каталоги, и вам, вероятно, придется работать с ними). ​​

Итак, ваш алгоритм должен быть:

  1. клонирует ваше удаленное репо в другой каталог
  2. , используя git filter-branch только файлы слева под некоторым подкаталогом, нажмите на новый пульт
  3. create commit, чтобы удалить этот подкаталог из ваше оригинальное дистанционное репо
5
ответ дан Olexandr Shapovalov 20 August 2018 в 12:07
поделиться

Изменить: добавлен скрипт Bash.

Ответы, приведенные здесь, работали частично для меня; В кеше осталось много больших файлов. Что в конечном итоге сработало (после часа в #git на freenode):

git clone --no-hardlinks file:///SOURCE /tmp/blubb
cd blubb
git filter-branch --subdirectory-filter ./PATH_TO_EXTRACT  --prune-empty --tag-name-filter cat -- --all
git clone file:///tmp/blubb/ /tmp/blooh
cd /tmp/blooh
git reflog expire --expire=now --all
git repack -ad
git gc --prune=now

С предыдущими решениями размер хранилища составлял около 100 МБ. Это снизило его до 1,7 МБ. Возможно, это помогает кому-то:)


Следующий скрипт bash автоматизирует задачу:

!/bin/bash

if (( $# < 3 ))
then
    echo "Usage:   $0 </path/to/repo/> <directory/to/extract/> <newName>"
    echo
    echo "Example: $0 /Projects/42.git first/answer/ firstAnswer"
    exit 1
fi


clone=/tmp/${3}Clone
newN=/tmp/${3}

git clone --no-hardlinks file://$1 ${clone}
cd ${clone}

git filter-branch --subdirectory-filter $2  --prune-empty --tag-name-filter cat -- --all

git clone file://${clone} ${newN}
cd ${newN}

git reflog expire --expire=now --all
git repack -ad
git gc --prune=now
38
ответ дан Simon A. Eugster 20 August 2018 в 12:07
поделиться

У меня была именно эта проблема, но все стандартные решения, основанные на git filter-branch, были очень медленными. Если у вас есть небольшой репозиторий, это может быть не проблема, это было для меня. Я написал еще одну программу фильтрации git на основе libgit2, которая в качестве первого шага создает ветви для каждой фильтрации первичного репозитория, а затем выталкивает их для очистки репозиториев в качестве следующего шага. В моем хранилище (500 Мб 100000 коммитов) стандартные методы фильтрации фильтров git занимали дни. Моя программа занимает несколько минут, чтобы выполнить ту же фильтрацию.

У этого сказочного имени git_filter и живет здесь:

https://github.com/slobobaby/git_filter

на GitHub.

Надеюсь, это кому-то полезно.

4
ответ дан slobobaby 20 August 2018 в 12:07
поделиться

Я рекомендую руководство GitHub по разделению подпапок в новый репозиторий . Шаги похожи на ответ Paul , но я понял, что их инструкции легче понять.

Я изменил инструкции, чтобы они применились к локальному репозиторию, а не к размещенному на нем GitHub.


Разделение вложенной папки в новый репозиторий

  1. Открыть Git Bash.
  2. Измените текущий рабочий каталог в том месте, где вы хотите создать новый репозиторий.
  3. Клонирование репозитория, содержащего подпапку.

git clone OLD-REPOSITORY-FOLDER NEW-REPOSITORY-FOLDER
  1. Измените текущий рабочий каталог на ваш клонированный репозиторий.

cd REPOSITORY-NAME
  1. Чтобы отфильтровать подпапку от остальной части файлы в репозитории, запустите git filter-branch, предоставив эту информацию: FOLDER-NAME: папка внутри вашего проекта, из которой вы хотите создать отдельный репозиторий. Совет. Пользователи Windows должны использовать / для разграничения папок. BRANCH-NAME: ветвь по умолчанию для вашего текущего проекта, например, master или gh-pages.

git filter-branch --prune-empty --subdirectory-filter FOLDER-NAME  BRANCH-NAME 
# Filter the specified branch in your directory and remove empty commits
Rewrite 48dc599c80e20527ed902928085e7861e6b3cbe6 (89/89)
Ref 'refs/heads/BRANCH-NAME' was rewritten
1
ответ дан Steven Vascellaro 20 August 2018 в 12:07
поделиться
  • 1
    Хороший пост, но я замечаю, что первый абзац документа, который вы связали, говорит If you create a new clone of the repository, you won't lose any of your Git history or changes when you split a folder into a separate repository.. Однако согласно комментариям ко всем ответам здесь сценарии filter-branch и subtree приводят к потере истории везде, где был переименован подкаталог. Есть ли что-то, что можно сделать для решения этой проблемы? – Adam 30 October 2017 в 12:53
  • 2
    Найден решение для сохранения всех коммитов, в том числе предшествующих переименованию / перемещению каталогов - это ответ rogerdpack на этот самый вопрос. – Adam 30 October 2017 в 18:42
  • 3
    Единственная проблема заключается в том, что я больше не могу использовать клонированное репо – Qiulang 3 April 2018 в 13:17

Я уверен, что поддерева git прекрасна и прекрасна, но мои подкаталоги git-кода, которые я хотел переместить, были в затмении. Поэтому, если вы используете egit, это очень легко. Возьмите проект, который хотите переместить, и team-> отключите его, а затем team-> поделитесь им с новым местоположением. Он по умолчанию пытается использовать старое местоположение репо, но вы можете снять флажок существующего выбора и выбрать новое место для его перемещения. Все приветствуют.

1
ответ дан stu 20 August 2018 в 12:07
поделиться
  • 1
    «Прекрасный и прекрасный» часть поддерева состоит в том, что история вашего подкаталога подходит для езды. Если вам не нужна история, то ваш мучительно легкий метод - это путь. – pglezen 11 February 2016 в 20:55

Вам может понадобиться что-то вроде «git reflog expire --expire = now -all» перед сборкой мусора, чтобы фактически очистить файлы. git filter-branch просто удаляет ссылки в истории, но не удаляет записи reflog, которые хранят данные. Конечно, сначала проверьте это.

Использование моего диска резко сократилось при этом, хотя мои начальные условия были несколько разными. Возможно, фильтр subdirectory отрицает эту потребность, но я сомневаюсь.

2
ответ дан user 20 August 2018 в 12:07
поделиться

Проверьте проект git_split в https://github.com/vangorra/git_split

Поверните каталоги git в свои собственные репозитории в своем собственном месте. Нет поддерева смешного дела. Этот скрипт возьмет существующий каталог в вашем репозитории git и превратит этот каталог в самостоятельный собственный репозиторий. По пути он скопирует всю историю изменений для предоставленного вами каталога.

./git_split.sh <src_repo> <src_branch> <relative_dir_path> <dest_repo>
        src_repo  - The source repo to pull from.
        src_branch - The branch of the source repo to pull from. (usually master)
        relative_dir_path   - Relative path of the directory in the source repo to split.
        dest_repo - The repo to push to.
2
ответ дан vangorra 20 August 2018 в 12:07
поделиться
1145
ответ дан Community 31 October 2018 в 09:48
поделиться
Другие вопросы по тегам:

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