Как предотвратить взлом жестких ссылок в Emacs?

13

Допустим, у меня есть два файла file1и file2:

$ echo aaa >file1
$ ln file1 file2

Затем я проверяю, совпадают ли inode:

$ ls -i
18749779 file1  18749779 file2

который показывает, что два файла на самом деле одинаковы. Теперь я редактирую file1в Emacs, добавляю строку, например, с текстом bbb, сохраняю ее и выхожу из Emacs.

Теперь я получаю:

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

Так что жесткая ссылка не работает. Обратите внимание, что это не происходит, когда я редактирую файл vimили просто делаю echo bbb >>file1..

Как я могу предотвратить взлом жестких ссылок в Emacs?

Обновить:

Обратите внимание, что у меня есть

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

в моем ~/.emacsфайле инициализации. Если я редактирую, file1используя emacs -Q file1вместо этого, я получаю файл с именем file1~в текущем каталоге, который ссылается file2(имеет тот же индекс), но file1~не был изменен (так что он идентичен старому file1) .. Это не то, что я хочу. Я хотел бы, чтобы оба file1и один и file2тот же файл, и включить обновленное содержимое файла ..

Хокон Хагланд
источник
3
Хорошо, я думаю, что нашел решение: если я добавлю (setq backup-by-copying t)в мой ~/.emacsфайл инициализации, он будет работать как нужно ..
Хакон Хагланд

Ответы:

10

@ Хакон решил свою проблему с:

(setq backup-by-copying t)

Если вы предпочитаете сохранить поведение по умолчанию и использовать его back-up-by-copyingтолько для жестко связанных файлов, вы можете использовать его вместо этого (и оставить backup-by-copyingдля него значение nil):

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

Кроме того, как отмечает @Harald, вы можете back-up-by-copyingвместо этого установить в качестве локальной файловой переменной, чтобы включить эту функцию только для отдельных файлов.

Объяснение такого поведения с Emacs руководства :

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

Смотрите связанную страницу для дальнейшего обсуждения.

Тайлер
источник
2
Обратите внимание, что вы можете установить это как локальную переменную файла, если вы не хотите, чтобы это поведение было для всех файлов.
Харальд Ханче-Олсен
@ HaraldHanche-Olsen отметил!
Тайлер