Хранить историю всех изменений текстового файла

Инструменты беспроводной связи устарели в пользу iw, поскольку беспроводные расширения устарели в пользу нового интерфейса nl80211 для беспроводных устройств. Об этом говорится в документации ядра для iw .

Однако nl80211 находится в активной разработке, и не все драйверы были перенесены на него. Инструменты беспроводной связи по-прежнему требуются для устройств, которые не были перенесены с беспроводных расширений.

Причина, по которой Ubuntu (и почти все известные мне дистрибутивы )предоставляют бета-версию 30, заключается в том, что эта версия исправляет критическую ошибку, которая была в версии 29, которая приводила к сбою iwconfig, если было слишком много сетей. в области из-за переполнения буфера. В репозитории Github для беспроводных инструментов этого нет, но вот соответствующий патч от Arch

7
10.09.2020, 19:16
8 ответов

Вы можете попробовать почтенный RCS (пакет "rcs" ), как упоминал @steeldriver, не -современная система управления версиями, которая работает на основе -файлов практически без накладных расходов или осложнений. Есть несколько способов его использования, но один вариант:

  • Создайте подкаталог RCS, в котором будет храниться история версий.
  • Отредактируйте файл
  • Зарегистрируйте свои изменения:ci -l -m -t- myfile
  • Повторить

Если вы сохраните этот текст в своем файле:

$RCSfile$
$Revision$
$Date$

затем RCS заполнит эти строки информацией о вашей версии и ее отметке даты,как только вы зарегистрируете это в (технически, когда вы зарегистрируете это ).

Файл, хранящийся в RCS/, будет называться myfile,vи будет содержать различия между каждой ревизией. Конечно, есть еще что узнать о RCS. Вы можете посмотреть справочные страницы для ci, co, rcs, rcsdiffи других.

Вот еще информация:

  • Если вы пропустите создание каталога RCS/, то архив появится в том же каталоге, что и ваш файл.
  • Вы «регистрируете» файл с помощью ci, чтобы записать его версию в архив (файл *,vв каталоге RCS/ ). Проверка -имеет странный побочный эффект удаления вашего файла, оставляя ваши данные только в архиве *,v. Чтобы избежать этого побочного эффекта, используйте -lили -uс командой ci.
  • Вы «извлекаете» файл с помощью co, чтобы воссоздать его из архива.
  • Вы «блокируете» файл, чтобы сделать его доступным для записи и предотвратить запись в него другими пользователями, что может привести к ситуации «слияния». В вашем случае, когда только один пользователь изменяет файл, «заблокированный» означает доступный для записи, а «разблокированный» означает только чтение -. Если вы измените и «разблокируете» файл (, принудительно записав в него ), ciбудет жаловаться, когда вы попытаетесь проверить изменения в (, поэтому избегайте этого ).
  • Поскольку вы единственный, кто редактирует свой файл, у вас есть выбор сценариев :вы можете оставить файл для чтения -только (разблокированным )или доступным для записи (заблокированным ). Я использую разблокированный режим для файлов, которые я не ожидаю часто изменять, так как это предотвращает их случайное изменение, потому что они доступны только для чтения -, даже для меня. Я использую заблокированный режим для файлов, которые я активно изменяю, но когда я хочу сохранить историю изменений содержимого.
  • Использование -lс ciили coблокирует его, оставляя доступным для записи.Без -lон будет читаться -только с coили вообще будет удален с ci. Используйте ci -u, чтобы оставить файл в режиме -только для чтения после проверки его содержимого в архиве.
  • Использование -m.предотвратит запрос ciсообщения о пересмотре.
  • Использование -t-предотвратит ciзапрос начального сообщения (при первом создании файла архива ).
  • Использование -Mс ciили coбудет синхронизировать отметку времени файла с отметкой времени файла во время проверки -в.
  • co -r1.2 -p -q myfileвыведет версию 1.2из myfileна стандартный вывод. Без опции -pи в предположении, что myfile"разблокирован" (только для чтения -только ), тогда co -r1.2 myfileперезапишет myfileкопией версии -только для чтения 1.2. ] из myfile. -qотключает информационные сообщения.
  • Вы можете создавать «ветви» с такими ревизиями, как 1.3.1.1. Я не рекомендую это, так как это быстро сбивает с толку. Я предпочитаю придерживаться линейного потока изменений.

Итак, если вы предпочитаете, чтобы ваш файл всегда был доступен для записи, вы можете использовать ci -l -M -m -t- myfile. Вы можете использовать rcsdiff myfile, чтобы увидеть различия между текущим содержимым myfileи самой последней проверенной версией -. Вы можете использовать rcsdiff -r1.2 -r1.4 myfile, чтобы увидеть различия между ревизиями 1.2и 1.4myfile.

Архивный файл — это просто текстовый файл, формат которого описан в man rcsfile. Однако не пытайтесь редактировать файл архива напрямую. IMO, архивный файл на основе текста -, абсолютно минимальный дополнительный багаж (, только один архивный файл )и замена ключевых слов являются самыми сильными сторонами RCS и делают его отличным инструментом только для локальных -, одиночных -пользователь, один -файл -в -a -управление версиями времени. Если бы я переделывал RCS, я бы устранил сложности, выходящие за рамки этого сценария (, например. многопользовательский -, ветвящийся ),которые, я думаю, лучше обрабатываются более современными распределенными системами контроля версий.

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

6
18.03.2021, 23:06

Вы правы, что контроль версий — это то, что нужно. Да, gitслишком сложно. Есть и другие инструменты контроля версий. Современные простые в использовании — это Subversion(svn)и Mercurial (hg).

  • subversion не является -распределенным, не -блокирующим, но поддерживает блокировку и имеет глобальный номер версии.
  • mercurial распространяется, -без блокировки (похож на git, но проще в использовании ).

Оба варианта просты в использовании.

Что сложногоgit

Многие люди отмечают, что использовать gitне сложнее, чем другие инструменты в отношении init, add, commitи push. Это почти верно (, за исключением того, что для того, чтобы git сделал фиксацию, вам нужно сделать add, тогдаcommit(это 200% необходимых усилий ).

Проблема возникает, когда вы начинаете делать то, для чего предназначена система контроля версий. До этого момента вы не получаете никакой выгоды. Вы только инвестируете в исправления, в надежде, что они будут полезны. Точно так же, как создание резервной копии бесполезно (, восстановление из резервной копии приносит пользу ).

Трудности связаны с анализом истории и путешествиями во времени. Здесь много подводных камней, и нет хороших бесплатных графических инструментов. svnи hgведут себя намного лучше, имеют удобную командную строку и графический интерфейс.

-1
18.03.2021, 23:06

Я использовал простой сценарий Bash, который, возможно, называется vers. Сводка:

  1. Запустите мой обычный редактор для файлов, переданных в качестве аргументов. После редактирования:
  2. Для каждого файла найдите наивысшее имя, например file.V[0-9][0-9].
  3. Если другая контрольная сумма, cp -pследующая старшая версия и chmod 400.
  4. Если нет предыдущей версии, сделайтеfile.V01
  5. Уберите все лишнее в подкаталог _VERSIONS.

Полезно для определения того, что вы изменили и в какие дни.

3
18.03.2021, 23:06

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

mkdir mnt
gitfs https://example.com/repo.git $PWD/mnt -o repo_path=$PWD/working_copy

После этого вы сможете редактировать файлы в mnt/current, и каждая версия файлов будет автоматически зафиксирована в git, а также будет доступна через mnt/history/*/*.

Обратите внимание, что первым аргументом должен быть удаленный репозиторий. Gitfs, похоже, не работает с локальным репозиторием :, если он пуст, он указывает git получить доступ к удаленному origin, которого не существует, и если он не -гол, Gitfs пытается нажать на него, что терпит неудачу, и Gitfs не сообщит вам об этом, кроме как через отладочное сообщение, поэтому вы потеряете все свои изменения.

Предостережение. :gitfs кажется довольно глючным и плохо поддерживается. Тихие сбои являются распространенной проблемой (перейдите -o log=-,debug=true,foreground=true,…для попытки диагностики ). Вам нужно включить user_allow_otherв /etc/fuse.conf, потому что манипулирование аргументами содержит ошибки . Это правильная концепция, но я не могу ее рекомендовать, если кто-то не возьмет на себя сопровождение и не исправит ее (Я не добровольно ).

4
18.03.2021, 23:06

Есть несколько способов сделать это:

  • vim
  • emacs
  • git
  • inotify-tools
  • git-annex(все -в -одно решение)

Все они подробно описаны здесь:

Использование Vim:

Тогда я бы порекомендовал использовать историю отмен, которая не только (, как следует из названия, )относится к действию undoвыполнения действия в редакторе Vim, но также и к тому, которое вы сохраняете. Подробнее здесь.

Добавление следующего в ваш.vimrc:

let vimDir = '$HOME/.vim'
let &runtimepath.=','.vimDir

" Keep undo history across sessions by storing it in a file
if has('persistent_undo')
    let myUndoDir = expand(vimDir. '/undodir')
" Create dirs
    call system('mkdir '. vimDir)
    call system('mkdir '. myUndoDir)
    let &undodir = myUndoDir
    set undofile
endif

Сделает так, чтобы все изменения/отмены постоянно сохранялись в каталоге undodirв вашем локальном каталоге vimDir, который по умолчанию находится либо в .vimв вашем домашнем каталоге, либо в других, упомянутых в выводе :versionили --versionв командной строке.

Для еще большего контроля над историей отмен я бы порекомендовал также использовать Undotree .

Использование Emacs:

Есть пакеты с похожим названием, называемые Undotree , которые делают аналогичные вещи. Подробнее об истории отмены здесь .

Использование Git:

Я бы рекомендовал использовать git -autocommit , который представляет собой небольшой bash-скрипт с git как единственными зависимостями, которые следят за текущим каталогом git (, где вы его запускаете )для любых новых файлов/или измененных файлов и зафиксировать их.

Учитывая природу Gitон сохраняет все изменения в файле, и хотя он не подходит для производственного/серьезного проекта, это полезное решение, если вы не возражаете против отсутствия сообщения фиксации/общего сообщение коммита (, которое вы всегда можете отредактировать/добавить позже ).

Запустите его после навигации по нужному каталогу git (, который сначала создается с помощью git initв определенном каталоге, дополнительная информация в официальном руководстве)вот так:

screen -dmS namehere git-autocommit -i 1 -V

, если вы используете screen, дляtmux:

tmux new -n namehere git-autocommit -i 1 -V

иначе:

git-autocommit -i 1 -V

будет достаточно, если вы предпочитаете не использовать его в фоновом режиме.

Использование инструментов inotify -:

Я бы рекомендовал использовать inotify-toolsили, точнее, inotifywatch, который может обнаруживать и (, как следует из его названия, )отслеживать файл/каталог на наличие изменений, с которыми вы затем можете выполнять действия (например, сохранить его в другом месте и т. д. ).

Здесь флаг для использования сinotifywatch:

inotifywait -r -m -q -e close_write --format %w%f yourdirectorypathhere

и здесь пример скрипта Bash, использующего приведенный выше:

#!/bin/bash
inotifywait -r -m -q -e close_write --format %w%f directorytowatch | while IFS= read -r file; do

    process $file
done

Где processможет быть чем угодно, например tar, если вы хотите сделать резервную копию при изменении файла, или rclone, если вы хотите загрузить его куда-нибудь...

Использование приложения git -:

Я бы рекомендовал git-annex, который включает не только Git, но и множество других внешних инструментов, таких как inotify-tools, bash, tar, rclone, borgи т. д.

Подробнее о здесь .

Если вам захочется прочитать вики/форум позже, вы также можете git клонировать его локально для чтения в автономном режиме:

git clone git://git-annex.branchable.com

для веб-сайта, форума (все в уценке, поэтому скачивается очень быстро... ), а кодовая база (на Haskell! )и т. д.

9
18.03.2021, 23:06

Возможно, вы захотите создать функцию, которая сделает за вас утомительную часть?

Например, (примечание :Я еще не знаю git, поэтому я просто добавил «команды-заполнители git», которые вы можете изменить, чтобы заставить их работать)

myvim () { vim "$@"  # put the arguments to myvim after vim (this allows you to add options, too)
           # and then the auto-commit part here. Note: I do *not* know git yet... fix where needed
           # I assume you are in the right directory for git init...
           { git init ; gid add ; git commit ;}
           # or if git add needs the names: (may want to get rid of options in args...)
           # { git init ; git add "$@" ; git commit ;}
           # or
           # { git init ; for f in "$@"; do git add "$f" ; done ; git commit ;}
}

Вы можете заменить ";" между командами с «&&», чтобы следующий шаг выполнялся только в том случае, если предыдущий вернул 0

1
18.03.2021, 23:06

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

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

NILFS хорошо -поддерживается в Linux и весьма эффективен при использовании для /home.

7
18.03.2021, 23:06

Возможно, вы захотите взглянуть на src(это означает Simple Revision Control ), облегченную систему для управления независимыми файлами (, а не целыми проектами ). Он доступен в Debian (small wonder )или его легко установить самостоятельно.

2
18.03.2021, 23:06

Теги

Похожие вопросы