Добавить лицензии для заголовков файлов в дереве, задним числом - PullRequest
4 голосов
/ 15 января 2012

Существует проект с закрытым исходным кодом, который будет открытым, и меня попросили попытаться добавить лицензии ко всем исходным файлам в репозитории SVN задним числом, поскольку история дерева может представлять общий интерес. Существует также интерес к миграции на DVCS, и hgsubversion не отслеживает svn mergeinfo, поэтому я решил попробовать преобразовать SVN-репозиторий в git (выполнить одностороннее преобразование, которое исправило теги и тому подобное), а затем попытаться отредактировать история оттуда.

На самом деле мне очень повезло, так как в самой первой ревизии была ветка, которая привела к работе, выполненной для более раннего публичного релиза. Таким образом, я решил попробовать git rebase sourcerelease-branch master. Через несколько очень болезненных часов я закончил ...

... за исключением одной проблемы. В преобразованном хранилище было несколько ветвей (включая «ветку», которая фактически была основной разработкой в ​​2009 или около того), и это не выглядело так, как ребаз прошел их. Спрашивая в #git, мне сказали, что невозможно сделать git rebase поперечных ветвей.

Хорошо стреляй ... что я могу сделать? Возможно ли то, что я собираюсь сделать, с помощью git или какой-то другой системы контроля версий?

РЕДАКТИРОВАТЬ: Вот изображение того, что у меня есть

          A---B random_branch
         /
C---D---E---F master
 \
  G---H add_license_branch

По сути, я хочу, чтобы изменения, которые я сделал в change-license-branch, появлялись в master и в любой ветви, которая ветвится от master, например random_branch. Когда я закончу, я даже не хочу add_license_branch, было бы неплохо, если бы я мог сжать C, G и H вместе и поставить результат там, где C сейчас.

Ответы [ 2 ]

3 голосов
/ 05 марта 2013

Я только что сделал что-то вроде этого, но немного проще, так как я хотел сохранить только одну ветку. Я хотел вставить уведомление об авторских правах вверху каждого (java) файла кода.

Я использовал filter-branch с --tree-filter, который проверяет каждый коммит и запускает для него команду оболочки, а затем повторно фиксирует. Дочерние коммиты не перебазируются, поэтому их нужно запускать для каждого коммита, иначе будет похоже, что уведомление было добавлено, а затем удалено.

Следующее находит все файлы кода Java и запускает sed для каждого, чтобы вставить содержимое файла в /path/to/header.txt в начале файла.

$ git filter-branch --tree-filter "find ./ -name '*.java' -exec sed -i '1 {
    h
    r /path/to/header.txt
    g
    N
}' {} \;" HEAD

Измените '*.java', чтобы он соответствовал файлам, которые вы хотите изменить, замените /path/to/header.txt на абсолютный путь к заголовку, который вы хотите вставить, и он должен работать для простого случая.

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

0 голосов
/ 15 января 2012

Не зная точную структуру своей истории, изучите следующие понятия:

git filter-branch
git rebase --preserve-merges
git rebase --onto
grafting
git-svn # for further work with the 2 repos
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...