Ich hatte kürzlich das Problem, meine ausgecheckte gitosis.conf
in einem Editor zu bearbeiten, der sie als UTF-8 mit Byte Order Mark abspeicherte. Im Grunde ist dagegen nichts einzuwenden, da Programme den Marker automatisch erkennen und die Datei als UTF-8 erkennen sollten — Git/Gitosis zählt in dieser Hinsicht leider noch nicht zu den schlaueren.
Das Resultat ist nach einem git push
— kurz gesagt — die Meldung ConfigParser.MissingSectionHeaderError: File contains no section headers
. Und das folgende Prachtstück an Ausgabe:
Counting objects: 8, done. Delta compression using up to 4 threads. Compressing objects: 100% (5/5), done. Writing objects: 100% (5/5), 1.03 KiB, done. Total 5 (delta 2), reused 0 (delta 0) remote: Traceback (most recent call last): remote: File "/usr/bin/gitosis-run-hook", line 9, in <module> remote: load_entry_point('gitosis==0.2', 'console_scripts', 'gitosis-run-hook')() remote: File "/usr/lib/pymodules/python2.6/gitosis/app.py", line 24, in run remote: return app.main() remote: File "/usr/lib/pymodules/python2.6/gitosis/app.py", line 38, in main remote: self.handle_args(parser, cfg, options, args) remote: File "/usr/lib/pymodules/python2.6/gitosis/run_hook.py", line 75, in handle_args remote: post_update(cfg, git_dir) remote: File "/usr/lib/pymodules/python2.6/gitosis/run_hook.py", line 33, in post_update remote: cfg.read(os.path.join(export, '..', 'gitosis.conf')) remote: File "/usr/lib/python2.6/ConfigParser.py", line 286, in read remote: self._read(fp, filename) remote: File "/usr/lib/python2.6/ConfigParser.py", line 482, in _read remote: raise MissingSectionHeaderError(fpname, lineno, line) remote: ConfigParser.MissingSectionHeaderError: File contains no section headers. remote: file: ./gitosis-export/../gitosis.conf, line: 1 remote: '\xef\xbb\xbf[gitosis]\n' To git@server:gitosis-admin.git a498f43..e05defa master -> master
Und danach ist vorbei mit lustig — da die “defekte” Datei bereits auf dem Server ist, schlagen alle weiteren pull
und push
-Versuche fehl.
Die Lösung besteht nun darin, auf dem Server das BOM aus der Datei zu bekommen. Dazu wechselt man zu Fuß in das Gitosis-Repository — z.B.: /srv/gitosis/repositories/gitosis-admin.git
— und legt ein Backup der Datei gitosis.conf
an. Theoretisch sollte man nun die Datei mit iconv
einfach zurück nach ANSI konvertieren können, das aber schlug bei mir fehl. Darum folgt nun an dieser Stelle etwas Voodoo mit awk
und alles ist wieder gut.
cp gitosis.conf gitosis-defect.conf awk '{if(NR==1)sub(/^\xef\xbb\xbf/,"");print}' gitosis-defect.conf > gitosis.conf
Kudos für die Lösung gehen an diese StackOverflow-Antwort. Es ist anzumerken, dass die Quell- und Zieldatei nicht identisch sein sollten.
Ein diff zwischen den beiden Dateien ergibt:
@@ -1,4 +1,4 @@ -<U+FEFF>[gitosis] +[gitosis]
Passt. Jetzt bloß nicht noch einmal die defekte Originaldatei pushen!