Comment empêcher Emacs de rompre les liens durs?

13

Disons que j'ai deux fichiers file1et file2:

$ echo aaa >file1
$ ln file1 file2

Ensuite, je vérifie que les inodes sont les mêmes:

$ ls -i
18749779 file1  18749779 file2

ce qui montre que les deux fichiers sont en fait les mêmes. Maintenant, je modifie file1dans Emacs, et j'ajoute une ligne avec par exemple le texte bbb, je l'enregistre et quitte Emacs.

Maintenant je reçois:

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

Le lien dur est donc rompu. Notez que cela ne se produit pas lorsque je modifie le fichier vimou si je le fais simplement echo bbb >>file1.

Comment puis-je empêcher Emacs de rompre les liens durs?

Mise à jour:

Notez que j'ai

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

dans mon ~/.emacsfichier init. Si je modifie en file1utilisant à la emacs -Q file1place, j'obtiens un fichier appelé file1~dans le répertoire courant qui est lié à file2(a le même inode) mais file1~n'a pas été modifié (il est donc identique à l'ancien file1). Ce n'est pas ce que je souhaite. Je voudrais les deux file1et file2être le même fichier, et inclure le contenu du fichier mis à jour ..

Håkon Hægland
la source
3
Ok, je pense que j'ai trouvé la solution: si j'ajoute (setq backup-by-copying t)à mon ~/.emacsfichier init, cela fonctionne comme souhaité ..
Håkon Hægland

Réponses:

10

@Hakon a résolu son propre problème avec:

(setq backup-by-copying t)

Si vous préférez conserver le comportement par défaut et l'utiliser back-up-by-copyinguniquement pour les fichiers liés en dur, vous pouvez utiliser ceci à la place (et laisser backup-by-copyingla valeur à nil):

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

En outre, comme l'a souligné @Harald, vous pouvez définir back-up-by-copyingune variable locale de fichier à la place, pour activer cette fonctionnalité uniquement pour les fichiers individuels.

L'explication de ce comportement dans le manuel Emacs :

Les fichiers de sauvegarde peuvent être créés en copiant l'ancien fichier ou en le renommant. Cela fait une différence lorsque l'ancien fichier a plusieurs noms (liens durs). Si l'ancien fichier est renommé dans le fichier de sauvegarde, les autres noms deviennent des noms pour le fichier de sauvegarde. Si l'ancien fichier est copié à la place, les autres noms restent des noms pour le fichier que vous modifiez et le contenu auquel ces noms accèdent sera le nouveau contenu.

Voir la page liée pour plus de discussion.

Tyler
la source
2
Notez que vous pouvez définir cela comme une variable locale de fichier, au cas où vous ne souhaiteriez pas ce comportement pour tous les fichiers.
Harald Hanche-Olsen
@ HaraldHanche-Olsen a noté!
Tyler