2013-05-30 5 views
16

Eines der Dinge, die ich in meinem open novel in GitHub halte, ist ein list of words Ich möchte automatisch die erste Zeile einstellen, die die Anzahl der Wörter im Wörterbuch ist. Meine erste Option besteht darin, einen Pre-Commit-Hook zu schreiben, der die Datei liest, die Wörter zählt, die erste Zeile neu schreibt und sie wieder zurückschreibt. Hier ist der CodeKönnen Sie einen Dateiinhalt während des Git-Commits ändern?

PRE_COMMIT { 
    my ($git) = @_; 
    my $branch = $git->command(qw/rev-parse --abbrev-ref HEAD/); 
    say "Pre-commit hook in $branch"; 
    if ($branch =~ /master/) { 
    my $changed = $git->command(qw/show --name-status/); 
    my @changed_files = ($changed =~ /\s\w\s+(\S+)/g); 
    if ($words ~~ @changed_files) { 
     my @words_content = read_file($words); 
     say "I have $#words_content words"; 
     $words_content[0] = "$#words_content\n"; 
     write_file($words, @words_content); 
    } 
    } 
}; 

Da jedoch die Datei bereits aufgeführt wurde, erhalte ich diesen Fehler

error: Your local changes to the following files would be overwritten by checkout: text/words.dic Please, commit your changes or stash them before you can switch branches. Aborting

könnte es besser sein als ein zu tun, post-commit Haken und haben es für die veränderte nächste Verpflichtung? Oder etwas völlig anderes machen? Die allgemeine Frage ist: Wenn Sie den Inhalt einer Datei während des Commits bearbeiten und ändern möchten, wie ist dies der richtige Weg?

Antwort

15

Das eigentliche Commit von git commit fest ist, was auch immer im Index ist, sobald der Pre-Commit Hook beendet ist. Dies bedeutet, dass Sie können Dateien im Vorab-Haken ändern, solange Sie git add sie auch.

Hier ist mein Beispiel Haken pre-commit, vom .sample geändert:

#!/bin/sh 
# 
# An example hook script to verify what is about to be committed. 
# [snipped much of what used to be in it, added this -- 
# make sure you take out the exec of git diff-index!] 

num=$(cat zorg) 
num=$(expr 0$num + 1) 
echo $num > zorg 
git add zorg 
echo "updated zorg to $num" 
exit 0 

und dann:

$ git commit -m dink 
updated zorg to 3 
[master 76eeefc] dink 
1 file changed, 1 insertion(+), 1 deletion(-) 

Aber einen kleinen Fehler beachten (wird nicht auf Ihren Fall anwenden):

$ git commit 
git commit 
updated zorg to 4 
# On branch master 
# Untracked files: 
[snip] 
nothing added to commit but untracked files present (use "git add" to track) 
$ git commit 
updated zorg to 5 
# Please enter the commit message for your changes. Lines starting 
[snip - I quit editor without changing anything] 
Aborting commit due to empty commit message. 
$ git commit 
updated zorg to 6 
# Please enter the commit message for your changes. Lines starting 

Grundsätzlich weil der Haken Updates und git add s pre-commit, hält die Datei e Erhöhen Obwohl ich das Commit hier nicht mache.

+0

es ist also im Grunde ein anderes Kind von Hack, oder? Auf meine Art wird die Datei geändert, aber nicht bis zur nächsten – jjmerelo

+1

Ja.Ich bin mir nicht sicher, ob ich mit beiden Ansätzen wirklich glücklich wäre; Ich hätte lieber etwas wie ein Makefile, um die Dinge nach Bedarf zu aktualisieren, und etwas mehr manuell. Aber es sollte funktionieren. – torek

+0

Vielleicht wäre es nach dem Commit richtiger? – jjmerelo

9

Es stellt sich heraus, Sie können "Haken" laufen - sie werden von einem anderen mecanism tatsächlich behandelt - wenn Dateien Staging (bei git add Zeit):

https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes#_keyword_expansion

(scrollen etwas nach unten " wisch/clean“Diagramm)

Hier ist, was ich verstanden:

  1. bearbeiten die .gitattributes, und erstellen Sie Regeln für die Dateien, die ein Wörterbuch-Update auslösen soll:

    novel.txt updateDict

  2. Dann sagen Git, was die "updateDict" Filter funktioniert auf wisch (git checkout) und sauber (git add):

    $ git config --global filter.updateDict.clean countWords.script

    $ git config --global filter.updateDict.smudge cat

Verwandte Themen