373 Stimmen

Auflisten von Untermodulen in einem Git-Repository

Ich habe ein Git-Repository, das mehrere Untermodule enthält. Wie liste ich die Namen aller Untermodule nach git submodule init durchgeführt wurde?

En git submodule foreach Befehl könnte die Namen der Submodule ausgeben, aber das funktioniert nur, wenn sie ausgecheckt wurden, was nach dem init-Schritt noch nicht geschehen ist. Es gibt weitere Schritte in der Kette, die stattfinden müssen, bevor sie ausgecheckt werden können, und ich möchte die Namen der Submodule nicht fest in das Skript einbauen müssen.

Gibt es also einen Git-Befehl, um die Namen aller derzeit registrierten, aber noch nicht ausgecheckten Submodule zu erhalten?

0voto

devC0de Punkte 1

Hier ist eine weitere Möglichkeit, Git-Submodulnamen aus .gitmodules zu parsen, ohne sed oder ausgefallene IFS-Einstellungen zu benötigen :-)

#!/bin/env bash

function stripStartAndEndQuotes {
  temp="${1%\"}"
  temp="${temp#\"}"
  echo "$temp"
}

function getSubmoduleNames {
  line=$1
  len=${#line} # Get line length
  stripStartAndEndQuotes "${line::len-1}" # Remove last character
}

while read line; do
  getSubmoduleNames "$line"
done < <(cat .gitmodules | grep "\[submodule.*\]" | cut -d ' ' -f 2-)

0voto

user Punkte 7158

Eine gute Alternative ist die Darstellung in einem Kommentar von Tino :

git config --null --file .gitmodules --get-regexp "\.path\$" | \
sed -nz "s/^[^\\n]*\n//p" | \
xargs --null rm -v;

Aber --null/-z ist für sed oder xargs auf BusyBox nicht verfügbar. Dann ist dies die beste Alternative, die ich finden konnte (wo xargs nicht auf Leerzeichen bricht):

grep "^\s*path\s*=" .gitmodules | \
sed -e "s/.*=\s*\"*//" -e "s/\"*\s*\$//" | \
xargs -n 1 -I mark rm -v "mark";

Aber es hat einen Nachteil, denn xargs wird aufgerufen ohne --null und wir verwenden -I mark Es frisst führenden Leerraum. Um dies zu beheben, verwenden Sie nicht xargs und schreiben die Namen in eine Datei:

grep "^\s*path\s*=" .gitmodules | \
sed -e "s/.*=\s*\"*//" -e "s/\"*\s*\$//" > tempfilefordanmxargsmotherbroked.txt;
while IFS= read -r line; do
   echo ".$line."
done <"tempfilefordanmxargsmotherbroked.txt"
rm "tempfilefordanmxargsmotherbroked.txt"
  • Berichtigung: xargs auf BusyBox entfernt keine führenden Leerzeichen, aber die Vollversion schon.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X