Ich habe the following bash function, die nach allen Dateien in einem Repository sucht, deren Dateiname einem regulären Ausdruck entspricht. Es findet derzeit alle Commits, in denen eine Datei existiert. Wie kann dies geändert werden, so dass es nur unter Dateien, die bearbeitet wurden (erstellt, geändert oder gelöscht) in jedem Commit?Bash-Funktion, um alle Git-Commits zu finden, in denen eine Datei (deren Name einem Regex entspricht) * geändert wurde *
Das war meine ursprüngliche Absicht für die Funktion. Ich war überrascht, dass die Ergebnisse viel breiter als erwartet waren. Der Grund, warum ich das versuche: Ich habe vor langer Zeit eine Datei erstellt, und irgendwann habe ich versehentlich einen wichtigen Abschnitt daraus gelöscht. Ich möchte eine Liste aller Punkte (commits), an denen diese Datei geändert wurde, so dass ich schnell zu der Version zurückkehren kann, die den fehlenden Abschnitt enthält, und ihn wieder in die aktuelle-commmit-Version einfügen.
:<<COMMENT
Searches all commits in the current git repository containing a file whose name matches a regular expression.
Usage: gitf <regex>
Parameter is required, and must be at least one non-whitespace character.
The original version of this function was based on the GitHub gist
- https://gist.github.com/anonymous/62d981890eccb48a99dc
written by Stack Overflow user Handyman5
- https://stackoverflow.com/users/459089/handyman5
which is based on this SO question:
- https://stackoverflow.com/questions/372506/how-can-i-search-git-branches-for-a-file-or-directory/372654#372654
The main section of this function was authored by Stack Overflow user
SwankSwashbucklers.
- https://stackoverflow.com/users/2615252/swankswashbucklers
- https://stackoverflow.com/a/28095750/2736496
Short description: Stored in GITF_DESC
COMMENT
#GITF_DESC: For "aliaf" command (with an 'f'). Must end with a newline.
GITF_DESC="gitf [searchterm]: Searches the current git repository for the file name that matches a regular expression.\n"
Körper:
gitf() {
#Exit if no parameter is provided (if it's the empty string)
param=$(echo "$1" | trim)
echo "$param"
if [ -z "$param" ] #http://tldp.org/LDP/abs/html/comparison-ops.html
then
echo "Required parameter missing. Cancelled"; return
fi
wasFound="0";
LOC=refs/remotes/origin # to search local branches only: 'refs/heads'
ref="%(refname)"
for branch in `git for-each-ref --format="$ref" $LOC`; do
for commit in `git rev-list $branch | grep -oP ^.\{7\}`; do
found=$(git ls-tree -r --name-only $commit | grep "$param")
if [ $? -eq 0 ]; then
echo "${branch#$LOC/}: $commit:"
while read line; do
echo " $line"
done < <(echo "$found")
wasFound="1";
fi
done
done
if [ "$wasFound" -eq "0" ]; then
echo "No files in this repository match '$param'."
fi
}
Beachten Sie, dass Sie mit modernem Git ein erweitertes Glob-Pattern verwenden können, wobei '**' eine beliebige Anzahl von Pfadkomponenten abgleichen kann (d. H. Auch '/', die nicht mit '*' übereinstimmt). –
Dies druckt den Körper jeder Datei aus. Basierend auf der akzeptierten Antwort in [diese Frage] (http://stackoverflow.com/questions/14207414/how-to-show-changed-file-name-only-with-git-log), die '--name- nur 'und' --online' Optionen verbessern es dramatisch: 'git log -p - nur -name --oneline --diff-filter = AMD --branches --tips -" * 05 _ * "'. – aliteralmind