#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. В моем примере репозитория ничего не пропущено, поэтому, если у вас нет доказательств, что что-то обрабатывается неправильно, пожалуйста, подумайте о принятии, чтобы другие могли более уверенно использовать ответ. Они все равно могут проголосовать против или прокомментировать, если это работает неправильно .