2016-06-10 2 views
1

Я реализую бота, который выполняет запланированные резервные копии. от переднего конца пользователь сможет изменить имена папок резервные копии хранятся вКогда я могу совершать перемещение файлов в git? (Jgit)

по формуле:. What's the purpose of git-mv?

mv oldname newname 
git add newname 
git rm oldname 

, что я хочу делать, когда папка или имя файла должен быть изменен. поэтому я перемещать файлы с помощью Java FileUtils, добавить новый файл/папку и удалите старый файл/папку с помощью:

git.add().addFilepattern(newName).call(); 
git.rm().addFilepattern(oldName).call(); 
git.commit().setAll(true).setMessage("Renamed group "+oldName+ " to " +newName).call(); 

Основная цель бытия: сохранить историю перемещаемых файлов.

Должен ли я зафиксировать после добавления «нового» файла перед удалением «старого»?

Является ли мой текущий порядок операций прекрасным и обязывающим после того, как обе операции должны сохранить историю изменений?

Я все еще новичок в Git и как работает журнал, в TortoiseGit он показывает файлы, добавленные и удаленные, будет ли он отображаться как перемещение в журнале, если процесс работал?

Спасибо за ваше время.

ответ

2

Git фактически не записывает историю отдельных файлов в репозитории; он записывает историю всего репозитория как единое целое. В коммите ничего не сказано, что явно указано, что foo.txt в редакции 2 является продолжением bar.txt в редакции 1. Вместо этого переименования выводятся с помощью инструментов, которые исследуют репозиторий - после, изменения были сделаны - с использованием эвристики, если if фиксация удаляет файл, а также создает другой файл с похожим содержимым, старый файл был переименован в новый.

Эта эвристика распознает только переименование, если оба изменения происходят в одной и той же фиксации. Если вы удалите файл, зафиксируете, затем добавьте файл обратно с другим именем и снова зафиксируете, Git увидит это как отдельное удаление и добавление несвязанных файлов.

Обратите внимание, что определение переименования является необязательным, и инструменты по умолчанию могут не работать. С git log вам нужно использовать опцию -M, например, или сделать git config --bool diff.renames true.

+0

спасибо за краткое объяснение! –

1

Я не знаком с JGit, но ваш Java-код, вероятно, должен отражать то, что Git фактически выполняет под интерфейсом при выполнении вашей команды. Поскольку вы уже это делаете, я не вижу никаких проблем. Я бы удостоверился, что вся операция переименования отображается в одном коммите. Есть несколько причин для этого. Возможно, вам захочется отменить переименование в какой-то момент. Если у вас есть одна фиксация, было бы легко сделать это через git revert.

Что касается сохранения истории, то переименование файла затрудняет отслеживание истории, but not impossible, например.

git log --follow ./path/to/file 
Смежные вопросы