Как обрезать репозиторий git-svn, чтобы удалить ветви и теги БЕЗ повторного клонирования?

#git #git-svn

#git #git-svn

Вопрос:

Если я забыл только проверить репозиторий trunk SVN и вместо этого проверил все, есть ли какой-нибудь способ обрезать мой репозиторий git-svn впоследствии без его повторного клонирования?

Комментарии:

1. Вы имеете в виду, что хотите обрезать оставшиеся ветви, которые не являются основными? Это репозиторий SVN или репозиторий Git?

2. @BrianaSwift: Вот еще один способ сказать это: я запустил git svn clone <repo> и клонировал весь репозиторий локально. Теперь я хочу добиться эффекта git svn clone <repo>/trunk от того, что у меня уже есть, без необходимости перезапускать clone удаленный репозиторий заново с нуля. Как мне это сделать?

3. Как только git отслеживает файлы (или версии файлов в ветвях), они никогда не могут быть отслежены. Это то, что вы пытаетесь сделать?

4. @BrianaSwift: Я не знаю точно, что git svn clone происходит под капотом, когда я говорю ему только клонировать trunk , поэтому я не знаю, эквивалентно ли то, что вы говорите, тому, что я пытаюсь сделать, или нет. Но я пытаюсь сделать буквально то, что я написал в приведенном выше комментарии, который должен быть довольно однозначным? Если мой синтаксис не ошибочен…

5. Какова цель удаления ветвей и тегов? Вы хотите освободить немного места на диске или хотите прекратить получать обновления для ветвей? В последнем случае вы можете использовать ключ svn-remote.<name>.ignore-paths конфигурации (см. Описание git svn fetch --ignore-paths at git-scm.com/docs/git-svn ).

Ответ №1:

Вы должны использовать git filter-branch with a subdirector-filter для изменения истории репозитория, чтобы включались только изменения магистрали и в корне каталога, например git filter-branch --subdirectory-filter trunk .

И вам также необходимо изменить сообщения о фиксации (например, в том же filter-branch прогоне с msg-filter , чтобы включить /trunk в git-svn метаданные, которые хранятся в сообщениях о фиксации, например git filter-branch --subdirectory-filter trunk --msg-filter 'sed s!/project@!/project/trunk@!'

Затем вам нужно изменить значение git конфигурации svn-remote.svn.url git config -e , чтобы синхронизировать только trunk путем добавления /trunk в конец.

Вам также необходимо обновить удаленную ссылку git-svn git update-ref refs/remotes/git-svn master .

И последнее, но не менее важное: вам нужно удалить некоторые метаданные, которые будут восстановлены git-svn путем удаления .git/svn/refs/ .

После всего этого все должно быть так, как вы хотели, я просто попробовал это с небольшим тестовым репозиторием.

Комментарии:

1. Немного беспокоюсь, не сломает ли это что-нибудь, но 1!

2. Честно говоря, я только что это придумал, поэтому он может что-то пропустить. Но, по крайней мере, для моего небольшого тестового примера это дает правильный результат. Единственное отличие от клонирования only trunk заключается в том, что пустые коммиты (например, коммиты, которые только устанавливают свойства или добавляют пустые каталоги) отсутствуют в дереве результатов, пока они были с помощью команды trunk clone .

3. Ну, я проголосовал, но я не решаюсь принять, учитывая, что я не уверен, что в нем ничего не пропущено… в моем случае я просто закончил повторное клонирование репозитория, поэтому я вообще не использовал это. :

4. В моем примере репозитория ничего не пропущено, поэтому, если у вас нет доказательств, что что-то обрабатывается неправильно, пожалуйста, подумайте о принятии, чтобы другие могли более уверенно использовать ответ. Они все равно могут проголосовать против или прокомментировать, если это работает неправильно .