2016-06-29 8 views
-1

Ich habe die folgende Perl. Es versucht, einen Git Clone (im Gegensatz zu einer Offline-Zip-Datei) zu erkennen und die Repo-Informationen auszudrucken. Die Idee ist, wenn git rev-parse fehlschlägt, dann ist es wahrscheinlich kein Git Repo.

if (system "git rev-parse HEAD") {       # Line 234 
    my $revision = `git rev-parse HEAD | cut 1-16`;  # Line 235 
    my $branch = `git rev-parse --abbrev-ref HEAD`;  # Line 236 
    print "Git repo: $branch ($revision)\n";    # Line 237 
}               # Line 238 

Es führt zu den Fehlern unten. Wenn ich What's the differences between system and backticks and pipes in Perl und How can I store the result of a system command in a Perl variable richtig analysiere, sollte es funktionieren.

Nach How to print variables in Perl sollte funktionieren. Basierend auf Global symbol requires explicit package, die Q & A sagt @ statt $ zu verwenden. Ich habe versucht, print "Git repo: @branch (@revision)\n", aber es führte zu den gleichen Fehlern (mit einem anderen Symbol).

Ich habe zwei Fragen:

  • Warum denkt Perl die Variable ein Paket?

  • Was ist los mit der Perl, und wie kann ich es beheben?


Global symbol "@branch" requires explicit package name at ./Configure line 237. 
Global symbol "@revision" requires explicit package name at ./Configure line 237. 
+0

Die 'system' kehrt '0' auf Erfolg. Wenn Sie also in Ihren 'if'-Block gelangen, bedeutet dies, dass der Befehl (git rev-parse HEAD) fehlgeschlagen ist. Dann wird dasselbe in 'qx' (Backticks) passieren. Ich vermute, dass Sie das nicht im Sinn haben? Was den Fehler betrifft, den Sie bekommen, habe ich keine Ahnung. Es bedeutet, dass die Variable $ branch nicht deklariert ist, was seltsam ist. – zdim

+0

Können Sie Ihren Code auf ein kurzes, lauffähiges Programm reduzieren, das das Problem aufzeigt? Mit dem in der Frage angegebenen Code (mit der Logik im 'if' reversed, aus Gründen, die zdim bereits erläutert wurde) kann ich die beschriebenen Fehler nicht reproduzieren. Abgesehen davon, dass der Text schlecht formatiert ist (Zeilenumbrüche am Ende von "$ branch" und "$ revision"), funktioniert es perfekt für mich. –

+0

@ zdim - danke. Ich bin wegen der globalen Symbolfehler nicht so weit gekommen (aber ich habe es vermutet). – jww

Antwort

0

ich das Skript nicht testen können, aber dieser Teil so sein sollte:

if(`git rev-parse HEAD 2>&1` !~ /Not a git repository/) { 
    chomp(my $revision = `git rev-parse HEAD | cut -c1-16`); 
    chomp(my $branch = `git rev-parse --abbrev-ref HEAD`); 
    print "Git repo: $branch ($revision)\n"; 
} 
Verwandte Themen