2016-08-05 12 views
0

Ich versuche, this link zu folgen, um mehrere Dateien auf einmal zu entfernen. Verwenden Sie einzeln den Befehl:Git-Filter-Zweig mit zwei Abfragen

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch "UserFiles/*"' --prune-empty --tag-name-filter cat -- --all 

funktioniert gut. Aber wenn ich versuche, auf 2 Abfragen zu kombinieren, sobald ich die Fehler zurück WARNING: Ref 'refs/heads/master' is unchanged

Der Befehl, den ich versuchte, war:

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch "testDir/*"' && 'git rm --cached --ignore-unmatch "UserFiles/*"' --prune-empty --tag-name-filter cat -- --all 

wie kann ich das Problem lösen?

Antwort

1

--index-filter Das Argument der Schale über eval gegeben ist. Was dies in der Praxis bedeutet, dass wenn man zwei unterschiedliche Index Filter ausgeführt werden müssen, würden Sie sie buchstabieren wie:

git filter-branch <args> --index-filter 'cmd1; cmd2' <more-args> 

Hinweis, dass dies ein Semikolon, kein Komma, und es geht innen die Anführungszeichen, die den Ausdruck zu einem einzigen Argument machen --index-filter.

In Ihrem speziellen Fall jedoch können Ihre Index-Filter wahrscheinlich mit einem Befehl erfolgen. Der ein Befehl lautet:

git rm -r --cached --ignore-unmatch UserFiles testDir 

Wenn -r (rekursiv entfernen) verwenden, gibt es keine Notwendigkeit für die /*, daher keine Notwendigkeit für die inneren Anführungszeichen. Natürlich muss der Befehl, der für den Indexfilter verwendet werden soll, wie immer als einzelnes Argument übergeben werden. Wenn er also Leerzeichen enthält - und wie wir sehen können -, müssen äußere Anführungszeichen sein . Daraus folgt:

git filter-branch -f \ 
    --index-filter 'git rm -r --cached --ignore-unmatch testDir UserFiles' \ 
    --prune-empty --tag-name-filter cat -- --all 

(brach ich dies in drei Linien, die ersten beiden endend mit Backslash-Newline, für die Zwecke der Veröffentlichung Da Backslash-Newline die Shell weiter zu lesen bekommt, können sie auf diese Weise eingegeben werden, oder Sie. kann es ohne den Rückstrich alles wieder in eine große Linie drehen.)


Wenn Ihre Absicht nur Dateien innerhalb der UserFiles und testDir Verzeichnisse zu entfernen ist, und keine Unterverzeichnisse undzu entfernenihre Dateien, diese "wahrscheinlich" ist falsch. Das heißt:

git rm -r --cached testDir 

wird entfernen testDir/a, testDir/b/c, testdir/b/d, testdir/b, testdir/c und testdir selbst, während:

git rm --cached "testDir/*" 

entfernen wird nur testDir/a und testDir/c, so dass testDir/b/ intakt.Wenn Sie das tun müssen, können Sie die -r Abkürzung nicht verwenden.

+0

danke. Ich musste auch Unterverzeichnisse entfernen. Ich weiß nicht, warum meins funktioniert hat, aber alles (außer den unerwünschten Dirs) wird jetzt ohne die Warnung geschoben. Ich akzeptiere deine Antwort jedoch, weil es im Gegensatz zu mir "warum" erklärt. – Rakim

0

Nach dem zufälligen Überprüfen verschiedener Kombinationen habe ich es bekommen. es sollte so sein:

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch "testDir/*"', 'git rm --cached --ignore-unmatch "UserFiles/*"' --prune-empty --tag-name-filter cat -- --all