Esiste un sistema di controllo versione semplificato appropriato per i non programmatori che scrivono in Emacs?


28

Sono un accademico e adoro fare il più possibile dei miei scritti in Emacs. Una cosa fondamentale che mi manca è la possibilità di rivedere facilmente le modifiche apportate a un file di testo nel tempo.

Le funzionalità di tracciamento degli articoli di Wikipedia o di Google Documenti sono entrambe sulla falsariga di ciò che sto cercando. Ho giocato con i sistemi di controllo della versione come git perché sembrano ben supportati da Emacs, ma li ho trovati difficili da usare e molto più complessi di quelli di cui ho bisogno. Registrare i repository, fare il check-in e il check-out, tutto ciò era solo problematico.

Suppongo che non ci siano pacchetti là fuori che forniscano la funzionalità che sto cercando in un modo relativamente user-friendly?


3
Ti consiglio di usare gite magit- github.com/magit/magit - dato che ci hai già giocato un po '. Probabilmente vorrai familiarizzare con le opzioni della riga di comando in modo da avere una migliore comprensione di ciò che magitsta facendo. Emacs non è per i non programmatori, ma sei stato in giro per la scena abbastanza a lungo da non averne paura - :) Potresti anche provare a giocare con gist: github.com/defunkt/gist.el
lista della legge

Tecnicamente, l'obiettivo del vc-gruppo di comandi è semplificare il processo di utilizzo dei VCS. Sfortunatamente, non sono così intuitivi da consentire agli utenti senza esperienza di farne buon uso. D'altra parte, sistemi come quelli che menzioni sono molto limitanti, in modo da poter sviluppare rapidamente richieste che non possono soddisfare. gnu.org/software/emacs/manual/html_node/emacs/… esiste un meccanismo semplicistico per conservare i backup, ma a causa di cui sopra, preferirei piuttosto imparare a usare alcuni VCS.
wvxvw,

6
Sono anche un accademico e ho iniziato a utilizzare git/ magitper il controllo della versione dei miei documenti. Iniziare sembra intimidatorio, ma a) non devi imparare tutto in una volta, e b) è divertente da usare dopo aver superato la curva di apprendimento iniziale. Un buon flusso di lavoro ti aiuta anche a disciplinare le tue attività di scrittura, in quanto ti incoraggia ad annotare ciò che stai facendo, il che è un ottimo modo per ottenere una cronologia dell'evoluzione del progetto di scrittura.
Dan

Su quale sistema operativo sei? Ho usato RCS per anni, e in precedenza SCCS, ma è iniziato nel caso in cui questo non fosse più in bundle con il sistema operativo, e recentemente sono passati a git, avendo avuto alcuni documenti sotto sovversione. Il processo di check in in git ha un passo in più rispetto a RCS, ma in una serie di situazioni, è molto utile avere set di file registrati insieme.
Andrew Swann,

Questo è stato nella mia mente, e l'auto-commit potrebbe essere parte della storia: impegnarsi automaticamente a git dopo ogni salvataggio projects.ryuslash.org/git-auto-commit-mode
grettke

Risposte:


43

Il problema con i sistemi di controllo versione esistenti non è tanto la loro complessità; è il fatto che ci sono così tante informazioni là fuori che può essere molto difficile per i principianti vedere la foresta per gli alberi (cioè, capire cosa fanno e non hanno bisogno di imparare quando stanno appena iniziando ).

Questo post si concentrerà gite descriverà come controllarlo da Emacs usando un pacchetto aggiuntivo chiamato magit. , gitè complesso, ma non è necessario imparare molto per usarlo in modo produttivo per lo scopo che descrivi.

Presumo che tu abbia gitinstallato (in caso contrario, scaricalo qui ) e che non vuoi affatto lasciare Emacs.


Installazione magit

magitè un gitfront-end per Emacs. È disponibile da MELPA e puoi installarlo tramite:

M-x package-install RET magit RET

Se non hai abilitato MELPA nella tua configurazione, puoi trovare istruzioni su come farlo qui .

Impostazione di un repository

Supponiamo che tu abbia una cartella chiamata ~/writingnella tua home directory che contiene uno o più documenti che vorresti mettere sotto il controllo della versione.

  1. Apri la cartella in Dired: C-x d ~/writing RET
  2. Apri una shell: M-x shell RET
  3. Digita git inite premi RET.

Questo è tutto. Ora hai un gitrepository. Non è necessario "registrarlo" da nessuna parte. gitè un sistema di controllo versione distribuito ; non richiede un server remoto per tenere traccia delle modifiche.

Verifica dello stato del repository

  1. Torna al buffer Dired che elenca i file nel tuo repository.
  2. Fare M-x magit-status RET.

Puoi pensare al buffer che si presenta come il tuo "pannello di controllo" per lavorare con il tuo repository. Per un nuovo repository, è simile al seguente:

Buffer di stato Magit per repository appena creato

  • Puoi navigare tra le diverse sezioni di questo buffer usando n( magit-goto-next-section) e p( magit-goto-previous-section).

  • È possibile aggiornare il buffer premendo g( magit-refresh).

Si noti che è possibile richiamare il buffer di stato da qualsiasi file o directory che appartiene al repository impostato in precedenza.

Aggiunta di file

Come puoi vedere nello screenshot, ci sono tre file nel repository che gitattualmente non sta monitorando. Per gitiniziare a tracciare un file, devi metterlo in scena : con il punto sul file che desideri aggiungere, premi s. Il buffer di stato sarà quindi simile al seguente:

Magit status buffer dopo aver aggiunto file-1.txt

commettere

Dopo aver messo in scena uno o più file, è possibile eseguirne il commit premendo c c. Questo farà apparire un buffer simile al seguente:

Magit buffer per l'immissione del messaggio di commit

Immettere il messaggio di commit in alto e quindi premere C-c C-cper finalizzare il commit. (Per interrompere, premere C-c C-k.)

Il buffer di stato sarà quindi simile al seguente:

Magit status buffer dopo il primo commit

Modifiche alla stadiazione

Se si apportano modifiche a un file tracciato, verranno elencati in una sezione separata ("Modifiche non messe in scena") nel buffer di stato:

Modifiche non messe in scena (compresse)

Per rivedere le modifiche apportate al file, vai alla riga che dice Modified file-1.txte premi TAB:

Modifiche non messe in scena (espanse)

Per mettere in scena queste modifiche, premere s:

Magit status buffer dopo la gestione temporanea delle modifiche al file tracciato

Visualizzazione degli impegni passati

Infine, se si desidera rivedere gli commit passati, è possibile premere l l(sono due L minuscole):

Magit log buffer

Come al solito, puoi navigare nel buffer che viene fornito con ne p. Magit mostrerà le modifiche associate ai singoli commit elencati in questo buffer in una finestra separata.

Sommario

Dalla shell:

  • git init: Inizializza il gitrepository nella directory corrente

Da qualsiasi file o directory associato a un gitrepository:

  • M-x magit-status RET

Dal buffer di stato:

  • s per aggiungere nuovi file o modifiche allo stage

  • c c per eseguire modifiche graduali

    • C-c C-c per finalizzare il commit
    • C-c C-k per interrompere il commit
  • l l per visualizzare i log di commit

Questo è tutto. :)


7
Non è necessario git initdalla shell. Se chiami M-x magit-statusda qualche parte al di fuori di qualsiasi repository git, ti verrà offerto di configurarne uno. (Ma dovrai richiamarlo di nuovo per visualizzare il buffer di stato dopo aver terminato l'installazione).
wvxvw,

Mi hai convinto che valga la pena dare un altro tentativo al controllo della versione, e questa dovrebbe essere una guida utile. Grazie!
Brian Z,

1
Fin qui tutto bene, ma una frustrazione è che quando cambio alcune parole in un lungo paragrafo, l'intero paragrafo viene evidenziato come un cambiamento graduale. Voglio davvero vedere i cambiamenti parola per parola piuttosto che riga per riga.
Brian Z,

3
@BrianZ È possibile personalizzare la variabile magit-diff-refine-hunkper ottenere il comportamento desiderato. Aggiungi (setq magit-diff-refine-hunk t) o (setq magit-diff-refine-hunk 'all) al tuo file init. Puoi fare C-h v magit-diff-refine-hunk RETper ottenere maggiori informazioni sul significato delle diverse impostazioni.
itsjeyd

Dovrai sperimentare le impostazioni magit-diff-refine-hunk per avvicinarti a ciò che desideri. Le impostazioni predefinite sono ottime per tenere traccia delle modifiche al codice, ma non necessariamente brillanti quando si desidera tenere traccia delle modifiche nei professionisti. Potrebbe volerci un po 'prima che tu riesca a farlo nel modo giusto, ma dovrebbe essere possibile e, una volta fatto, sospetto che non tornerai più indietro!
Tim X

11

Oltre a magit(come dimostra abilmente la risposta di @ itsjeyd), puoi anche provare git-timemachine, che fornisce funzionalità per scorrere rapidamente le versioni precedenti di un file sotto il gitcontrollo della versione. Secondo la sua pagina github, le seguenti combinazioni di tasti predefinite ti danno un'idea di cosa puoi fare:

  • p Visita la versione storica precedente
  • n Visita la prossima versione storica
  • w Copia l'hash abbreviato della versione storica corrente
  • W Copia l'hash completo della versione storica corrente
  • q Esci dalla macchina del tempo.

8

Sospetto che troverai la modalità Backup e / o Backup Walker molto interessante.

Entrambi mirano a sfruttare i meccanismi di backup esistenti in Emacs e fornire un migliore accesso e visibilità della cronologia dei file, senza richiedere un VCS aggiuntivo.


6

Come accennato, un modo semplice per avere diverse versioni di un file è il sistema di backup di Emacs.

(setq backup-directory-alist '(("." . "~/emacs-backups"))
      version-control 'numbered
      make-backup-files t
      delete-old-versions 'never)

Questo utilizzerà una directory dedicata per i backup numerati, che non verranno mai eliminati automaticamente. Quindi è possibile utilizzare C-u C-x C-sper creare un'altra versione in qualsiasi momento.

Tuttavia, penso, non esiste un'interfaccia facile e pronta per l'uso, ad esempio per diffondere queste versioni. Quindi dovresti aprire manualmente uno o due di quei backup e usarli ediff-bufferssu di essi e / o sul buffer originale.


1
È possibile differenziare i backup utilizzando, ad esempio: gnu.org/software/emacs/manual/html_node/emacs/… (contrassegnare un file con mpunto di spostamento sull'altro file e premere =).
wvxvw,

2
Sembrava un'opzione attraente in teoria, ma mi dà solo una schiacciante cartella piena di backup casuali. Le versioni che mi interessano sono completamente sepolte. Forse c'è un modo per attivare manualmente un backup numerato di un file, ma solo quando lo voglio? Se potessi anche allegare un breve "messaggio di commit" a quel backup in qualche modo, allora sarebbe una soluzione molto bella. Ma per ora, credo di essere bloccato a imparare magit :)
Brian Z,

2

Non ho ancora avuto l'opportunità di utilizzare questa soluzione, ma potresti anche prendere in considerazione il flashbake di Cory Doctorow e Thomas Gideon . Ecco cosa ha da dire Doctorow a riguardo :

Mi è stato chiesto di farlo dopo le discussioni con diversi archivisti digitali che si sono lamentati del fatto che, prima dell'era computerizzata, gli scrittori hanno prodotto una serie di bozze complete sulla strada delle pubblicazioni, complete di cancellature, annotazioni e così via. Questi sono oro d'archivio, poiché illuminano il processo creativo in un modo che rivela spesso le storie nascoste dietro i libri a cui teniamo. Al contrario, molti scrittori producono solo un singolo (o pochi) file digitali che vengono modificati fino al momento della pubblicazione, senza alcuna vera registrazione sistematica degli stati intermedi tra il primo bit di composizione e la bozza finale.

Inserisci Flashbake. Ogni 15 minuti, Flashbake esamina tutti i file che chiedi di controllare (ho tutti i miei racconti in corso, la mia lista di cose da fare, il mio file di informazioni utili e le versioni elettroniche completate dei miei libri recenti ) e registra tutte le modifiche apportate dall'ultimo controllo, annotandole con l'attuale fuso orario sull'orologio di sistema, il tempo in quel fuso orario recuperato da Google e gli ultimi tre titoli con il tuo sottotitolo sotto di loro nell'RSS del tuo blog feed (lo sto caratterizzando come "Dove sono, com'è lì e a cosa sto pensando?"). Registra anche i tempi di attività del tuo computer. Per una versione futura, penso che sarebbe divertente avere le tre canzoni più recenti suonate dal tuo lettore musicale.

Detto questo, non ho mai avuto l'opportunità di provarlo, dal momento che ho finito per scrivere un sacco di cose in modalità org, e stavo programmando molto e ... beh ... in qualche modo sono migliorato nell'usare magit, e alla fine, in un certo senso ... non avevo bisogno di usarlo.

In ogni caso, questa soluzione era rivolta a scrittori che lavoravano su progetti non tecnici. Potresti scoprire che potrebbe soddisfare le tue esigenze.


1

Sebbene sia assolutamente non correlato a emacs, puoi comunque salvare i tuoi file di testo su Dropbox e se sei un utente professionista puoi utilizzare la cronologia delle versioni estesa . (Se vuoi l'encrytion, potresti voler guardare SparkleShare .)

Poi c'è flashbake che è un po 'automatizzato ( ecco un tutorial ).

Inoltre è stato chiesto anche altrove , per il quale potresti trovare utili le risposte.


Flashbake sembra molto promettente. Ci proverò sicuramente.
Brian Z,

-1

Puoi usare Dropbox. Rende la versione revisionabile del tuo file ogni volta che premi Cx Cs. Per la crittografia dei miei file di testo utilizzo GNU Privacy Guard, supportato da Emacs.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.