Wie kann verhindert werden, dass Emacs harte Verbindungen unterbricht?

13

Angenommen, ich habe zwei Dateien file1und file2:

$ echo aaa >file1
$ ln file1 file2

Dann überprüfe ich, ob die Inodes gleich sind:

$ ls -i
18749779 file1  18749779 file2

Dies zeigt, dass die beiden Dateien tatsächlich gleich sind. Jetzt bearbeite ich file1in Emacs und füge eine Zeile mit beispielsweise dem Text hinzu bbb, speichere sie und beende Emacs.

Jetzt bekomme ich:

$ ls -i
18749781 file1  18749779 file2
$ cat file1
aaa
bbb
$ cat file2
aaa

Die harte Verbindung ist also unterbrochen. Beachten Sie, dass dies nicht passiert, wenn ich die Datei bearbeite vimoder wenn ich es einfach tue echo bbb >>file1.

Wie kann ich verhindern, dass Emacs harte Links unterbricht?

Aktualisieren:

Beachten Sie, dass ich habe

(require 'backup-dir)
(setq bkup-backup-directory-info
      '((t  "~/.emacs-backups/" ok-create full-path )))

in meiner ~/.emacsInit-Datei. Wenn ich bearbeiten file1Verwendung emacs -Q file1stattdessen ich eine Datei mit dem Namen bekommen file1~im aktuellen Verzeichnis , dass Links zu file2(die gleiche Inode hat) , aber das file1~hat sich nicht geändert (so ist es identisch mit dem alten file1) .. Dies ist nicht das, was ich will. Ich würde beide mögen file1und file2die gleiche Datei zu sein, und die aktualisierten Dateiinhalte aufzunehmen ..

Håkon Hægland
quelle
3
Ok, ich denke, ich habe die Lösung gefunden: Wenn ich (setq backup-by-copying t)zu meiner ~/.emacsInit-Datei hinzufüge , funktioniert es wie gewünscht.
Håkon Hægland

Antworten:

10

@ Hakon löste sein eigenes Problem mit:

(setq backup-by-copying t)

Wenn Sie es vorziehen , das Standardverhalten zu behalten, und verwenden Sie back-up-by-copyingnur für Dateien fest verbunden, können Sie diese stattdessen verwenden (und verlassen backup-by-copyingSatz nil):

(setq backup-by-copying-when-linked t)

Wie von @Harald hervorgehoben, können Sie back-up-by-copyingstattdessen eine dateilokale Variable festlegen , um diese Funktion nur für einzelne Dateien zu aktivieren .

Die Erklärung dieses Verhaltens aus dem Emacs- Handbuch :

Sicherungsdateien können durch Kopieren der alten Datei oder durch Umbenennen erstellt werden. Dies macht einen Unterschied, wenn die alte Datei mehrere Namen hat (feste Links). Wenn die alte Datei in die Sicherungsdatei umbenannt wird, werden die alternativen Namen zu Namen für die Sicherungsdatei. Wenn stattdessen die alte Datei kopiert wird, bleiben die alternativen Namen Namen für die Datei, die Sie bearbeiten, und der Inhalt, auf den diese Namen zugreifen, ist der neue Inhalt.

Weitere Informationen finden Sie auf der verlinkten Seite.

Tyler
quelle
2
Beachten Sie, dass Sie dies als lokale Dateivariable festlegen können, falls Sie dieses Verhalten nicht für alle Dateien wünschen .
Harald Hanche-Olsen
@ HaraldHanche-Olsen notiert!
Tyler