保留對文本文件的所有修改的歷史記錄
我有一個純文字文件(不包含原始碼)。我經常修改它(添加行、編輯現有行或任何其他可能的修改)。對於任何修改,我想自動記錄:
- 修改了什麼(差異資訊);
- 修改的日期和時間。
(理想情況下,我還希望能夠在特定時間獲得我的文件版本,但這是一個加號,不是必需的)。
使用 Git 肯定可以做到這一點,但它過於強大和復雜。我不想每次都處理
add
,commit
消息等。push
我只想用vi
(或等效的)編輯文件,保存它,並自動記錄上面的修改(它的差異和時間)。在 Linux 中是否有工具可以做到這一點?
更新:感謝您提出的所有建議和幾個解決方案。我不反對
git
,但我明確希望避免它(出於幾個原因,最後但並非最不重要的事實是我對它的了解不夠)。最接近上述要求(沒有git
、沒有送出消息、很少或沒有成本)的工具是 RCS。它是基於文件的,這正是我想要的。這甚至可以避免使用腳本,提供文件的先前版本並避免為vi
.問題的要求是準確的;已經給出了許多意見,但問題本身並不是基於意見的。然後,顯然,可以通過工具或腳本來實現相同的目標,但這也適用於許多其他情況。
給
git
一個機會我不明白為什麼使用強大的工具是個問題。
git
只需編寫一個定期執行的簡單 bash 腳本(通過cron
或systemd
計時器);自動生成送出消息等。正如其他人在評論中強調的那樣 - 當然 - 可以創建本地儲存庫(有關更多詳細資訊,請參見此處和此處)。
如果您更喜歡託管自己的遠端儲存庫,則需要設置“裸儲存庫”。兩者都
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
將使每個更改/撤消都永久保存在
undodir
local 下的目錄下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
。更多資訊在這裡。
如果你想稍後閱讀 wiki/forum,你也可以在本地 git clone 它,以供離線閱讀:
git clone git://git-annex.branchable.com
用於網站、論壇(都在 Markdown 中,所以下載速度非常快……)和程式碼庫(在 Haskell 中!)等