Linux

保留對文本文件的所有修改的歷史記錄

  • March 25, 2021

我有一個純文字文件(不包含原始碼)。我經常修改它(添加行、編輯現有行或任何其他可能的修改)。對於任何修改,我想自動記錄:

  • 修改了什麼(差異資訊);
  • 修改的日期和時間。

(理想情況下,我還希望能夠在特定時間獲得我的文件版本,但這是一個加號,不是必需的)。

使用 Git 肯定可以做到這一點,但它過於強大和復雜。我不想每次都處理add,commit消息等。push我只想用vi(或等效的)編輯文件,保存它,並自動記錄上面的修改(它的差異和時間)。

在 Linux 中是否有工具可以做到這一點?


更新:感謝您提出的所有建議和幾個解決方案。我不反對git,但我明確希望避免它(出於幾個原因,最後但並非最不重要的事實是我對它的了解不夠)。最接近上述要求(沒有git、沒有送出消息、很少或沒有成本)的工具是 RCS。它是基於文件的,這正是我想要的。這甚至可以避免使用腳本,提供文件的先前版本並避免為vi.


問題的要求是準確的;已經給出了許多意見,但問題本身並不是基於意見的。然後,顯然,可以通過工具或腳本來實現相同的目標,但這也適用於許多其他情況。

git一個機會

我不明白為什麼使用強大的工具是個問題。git只需編寫一個定期執行的簡單 bash 腳本(通過cronsystemd計時器);自動生成送出消息等。

正如其他人在評論中強調的那樣 - 當然 - 可以創建本地儲存庫(有關更多詳細資訊,請參見此處此處)。

如果您更喜歡託管自己的遠端儲存庫,則需要設置“裸儲存庫”。兩者都git init接受git clone一個--bare論點。

博格備份

我也可以推薦borg backup。它為您提供:

  • 時間戳
  • borg diff(比較快照之間)
  • 修剪(擺脫較舊的快照 - 假設您每天都想要目前月份的快照,否則每月只有一個)
  • 加密(可選)
  • 壓縮(可選)
  • 以及更多…

很酷的是它非常靈活——它很容易設置,但如果你願意,它會給你很多選擇。

我曾經寫過一份快速入門指南,可能會有所幫助。

有幾種方法可以做到這一點:

  • vim
  • emacs
  • git
  • inotify-tools
  • git-annex(多合一解決方案)

這裡都有詳細說明:

使用 Vim:

然後我推薦使用 undo history,它不僅(正如它的名字所暗示的那樣)與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

將使每個更改/撤消都永久保存在 undodirlocal 下的目錄下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,rcloneborg

更多資訊在這裡

如果你想稍後閱讀 wiki/forum,你也可以在本地 git clone 它,以供離線閱讀:

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

用於網站、論壇(都在 Markdown 中,所以下載速度非常快……)和程式碼庫(在 Haskell 中!)等

引用自:https://unix.stackexchange.com/questions/608577