Как объединить историю нескольких файлов в Git/SVN

Я переношу старый репозиторий из SVN в Git. Этот репозиторий содержит несколько файлов, но по историческим причинам они существуют в подкаталоге для каждого месяца. Например:

Номинальные файлы

a.txt
b.txt
c.txt

Фактический макет

/
|-201601
|  |- a.txt
|  |- b.txt
|  |- c.txt
|-201602
|  |- a.txt
|  |- b.txt
|  |- c.txt
|  
...
|-201807
   |- a.txt
   |- b.txt
   |- c.txt

(note no files at top level)

В рамках переноса я собираюсь удалить эти устаревшие подкаталоги, и у нас останутся только файлы верхнего уровня. Однако в идеале хотелось бы объединить историю со всех "версий" файла в одну - то есть запуск git log a.txt в новом репо показал бы все изменения, которые ранее были зафиксированы в 201807/a.txt, 201806/a.txt и т.д.

Есть ли команда Git (или набор команд), которая позволит мне объединить истории/коммиты из нескольких файлов в один файл?

(Если это проще в Subversion, это тоже вариант; я могу изменить старый репозиторий перед импортом в Git.)


person Andrzej Doyle    schedule 04.07.2018    source источник
comment
У Git нет истории файлов. Git имеет только коммиты; коммиты являются историей. Коммиты содержат файлы, поэтому, извлекая каждый коммит по одному и изучая содержащиеся в нем файлы, можно вычислить историю для некоторого набора файлов, но это чисто динамическое создание этого извлечения-и- процесс вычисления. История остается тем, что было зафиксировано, сохраненным в этих коммитах.   -  person torek    schedule 04.07.2018
comment
Для вас это означает, что когда вы импортируете коммиты в Git, если файлы имеют одинаковые пути, они являются одними и теми же файлами. Вы можете сделать переименование где угодно, прежде чем делать из них коммиты. Если вы сделаете это после совершения коммитов, вы застряли: вам нужно создать совершенно новый подграф коммитов, в котором есть файлы с новыми именами. Вы можете сделать это с помощью git filter-branch, но это в лучшем случае болезненно.   -  person torek    schedule 04.07.2018
comment
Вы также хотите объединить все файлы? или можно просто получить последнюю версию файла?   -  person Nimeshka Srimal    schedule 05.07.2018
comment
@torek Мммм, это имеет смысл. Таким образом, единственный способ добиться этого - изменить каждую фиксацию так, чтобы файлы были (предположительно) зафиксированы как пути (пути) верхнего уровня. Я могу понять, почему это было бы сложно, граничащее с невыполнимым.   -  person Andrzej Doyle    schedule 05.07.2018
comment
@NimeshkaSrimal Я могу просто взять последнюю версию каждого файла. Хотя в этом случае оба варианта были бы одинаковыми: файлы модифицировались/изменялись только тогда, когда они были последней версии. (Например, файл 201806/a.txt будет изменен только в июне 2018 года; как только наступит июль, этот файл будет скопирован в 201807/a.txt, и с этого момента любые изменения будут применяться к последнему файлу. Это глупая система, поэтому я собираюсь избавиться от него)   -  person Andrzej Doyle    schedule 05.07.2018
comment
@AndrzejDoyle, как насчет того, чтобы скопировать последние файлы в корень и запустить, например, git log --follow a.txt? Я думаю, он должен показать вам полную историю, так как вы сказали, что копируете файл каждый месяц.   -  person Nimeshka Srimal    schedule 05.07.2018


Ответы (1)


Во-первых, что касается импорта из SVN в Git, следует использовать инструмент SubGit (бесплатно для одноразового импорта).

Во-вторых, вы можете рассматривать каждую папку с датами как «ветви» в SVN (с их собственной историей), и вы можете следить за «Макет изменен в истории", чтобы указать SubGit, как обрабатывать эти папки.
Если это не применимо здесь (поскольку ссылка, которую я упоминаю, предназначена для one, которая переименована в своей истории SVN), тогда вам нужно будет сопоставить каждую папку/ветвь с веткой Git.

person VonC    schedule 07.09.2018