2013-12-02 2 views
0

Я пишу скрипт python, чтобы обновлять мои dotfiles с помощью репозитория на GitHub. Он копирует файлы точек в отдельный каталог (~/dotfiles), так что мой домашний каталог не является репозиторией git. Перед копированием файлов он делает filecmp.cmp(fileInLocalRepo,fileInHomeDir), чтобы узнать, изменился ли файл с момента последнего копирования в локальное репо. Как только все файлы будут обновлены, если произошли какие-либо изменения, измененные файлы будут перенесены в GitHub.Лучший способ сравнить удаленные версии файла git с локальными версиями файлов?

Это работает нормально, пока я не начну обновлять файлы точек с более чем одного компьютера, а старые файлы могут потенциально перезаписать мои удаленные. Если я сначала вытащил файлы до моего локального dotfiles репо, filecmp.cmp() все равно скажет, что файлы разные, и скрипт перезапишет вытащенный файл локальным, а затем нажмите, потому что он считает, что произошли изменения.

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

ответ

3

Предполагая, что все компьютеры, на которых вы устанавливаете это, имеют точное время, вы можете создать файл временного штампа для каждого точечного файла, который просто содержит локальное измененное время dotfile. Затем вы можете сравнить локальную метку времени с удаленной.

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

Потенциально более простое и менее подверженное ошибкам решение (потому что это более ручное) было бы, чтобы ваши dotfiles были привязаны к dotfiles в git. Затем, когда вы редактируете dotfile, git обновляется, и вы можете вручную зафиксировать и нажимать изменения легко.

+0

Спасибо! Я пошел с сохранением временных меток в файле. Мне нравится идея symlink, но мне также хотелось бы, чтобы этот скрипт был чем-то, что любой мог загрузить и использовать, чтобы обновлять свои dotfiles, если они этого захотят. Имея это в виду, я не думаю, что перемещение чей-то точечных файлов и их символическое связывание является самым безопасным вариантом в случае, если что-то произошло. – PseudoPsyche

Смежные вопросы