Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Version Control > [git] копирование файла


Автор: Eric-S 05.01.18, 09:55
Здравствуйте!

Подскажите пожалуйста, как скопировать файл? Чтоб в рабочей копии появилось два файла с разными именами, но одинаковым содержимым и историей изменений?

касательно корректности такой операции, это уже отдельный филосовский вопрос. Но всё же приведу два примера когда мне такое необходимо.

1. в первом файле есть две группы функций. Я осознал, что их нужно разделить. Первая группа остаётся в первом файле. А вторая группа должна оказаться в новом. Сейчас просто вырезаю и вставляю. Но теряю историю изменений.

2. два файла, точнее часть изменений в них, хочется держать в идентичном состоянии. В идеале нужен общий чистый предок. В предок вносятся какие-то правки, а потом они спускаются клонам.
Например шаблон главного файла с точкой входа. Иногда приходится его менять. А затем руками дублировать код инициализации, деинициализации или перехвата исключений.

В интернете на запрос копирования в git мне почему-то постоянно предлагают checkout. Но я же не хочу извлекать файл. Мне надо сделать его копию.

Возможно есть другие варианты для получения желаемого? Подскажите, как надо делать?

В svn есть команда copy. В tortoise svn из обозревателя можно скопировать файл в рабочую директорию, указав произвольное имя. А вот у git почему-то такого не нашёл.

Автор: amk 05.01.18, 12:28
Похоже на какой-нибудь файл настроек.

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

А с настройками предпочитаю структуру в виде дерева (точнее гамака), тогда изменение настроек в одном узле меняет их и у всех его наследников.

Автор: Eric-S 05.01.18, 12:39
Цитата amk @
Похоже на какой-нибудь файл настроек.
...
А с настройками предпочитаю структуру в виде дерева (точнее гамака), тогда изменение настроек в одном узле меняет их и у всех его наследников.

Кстати, это тоже актуально. Для настроек тоже можно было бы.
Делать в виде гамака? Тогда придётся прописывать интересные пути:
..\..\xxx.cfg
Не так страшно, но разварачивать неудобно. Но можно подумать над вариантами.

Автор: OpenGL 11.01.18, 08:43
Цитата Eric-S @
Подскажите пожалуйста, как скопировать файл? Чтоб в рабочей копии появилось два файла с разными именами, но одинаковым содержимым и историей изменений?

А если попробовать переместить файл дважды в два разных места параллельно из одной ревизии, а затем две полученные ревизии слить - что получится?

Автор: amk 11.01.18, 15:05
Цитата OpenGL @
А если попробовать переместить файл дважды в два разных места параллельно из одной ревизии, а затем две полученные ревизии слить - что получится?
Хм, можно попробовать.

Добавлено
Ничего не вышло. Перед вторым push'ем приходится pull'ить первое переименование. В результате получается множественный конфликт и при разрешении появляется вновь созданный файл.
То есть телодвижений много, а результат тот же, что при обычном копировании. Даже хуже, так как историю в результате потеряли оба файла.

Автор: Eric-S 11.01.18, 18:37
Цитата OpenGL @
А если попробовать переместить файл дважды в два разных места параллельно из одной ревизии, а затем две полученные ревизии слить - что получится?

О подобных трюках я думал. Даже о том, чтоб сделать векту, переименовать в ней файл, а затем слить.
Но я даже не стал проверять, ибо слишком много действий.

Автор: amk 12.01.18, 15:24
Я проверил. Специально завёл репозиторий для тестирования. Создал его копию. Создал в ней файл, откоммитил. Отредактировал файл, откоммитил и push'нул. Создал ещё одну копию. Переименовал файл в первой копии, откоммитил, и push'нул. переименовал файл во второй копии, откоммитил, psh не прошёл, сказал, надо сделать merge. Сделал pull, получил аж три конфликта. Разрешилд конфликты указав оставить оба файла. Получил, что второй файл новый. То есть тот же результат, как если бы я его просто скопировал. Сделал push, и после pull в первой рабочей копии обнаружил, что исходный файл просто удалился, а обе копии числятся как вновь созданные.

Автор: BladeMa 27.05.18, 19:07
А что, если он пытается скопировать файл до того, как я дойду до присвоения имени? Просто по нажатию ОК у меня зовутся другие операции, и может после того, как там отработает тело начинается копирование файла?

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)