wie man Regex im Befehl git checkout verwendet, um Dateiteilmengen anzugeben

Lesezeit: 3 Minuten

Benutzer-Avatar
Benutzer2167582

Angenommen, ich versuche, einen bestimmten Satz von Git-Dateien auszuchecken, z app/*^(.tmpl).html,

wie man diese Regex hineinwirft git checkout branch -- (regex)

  • Welchen Befehl haben Sie aus meiner Antwort unten verwendet? a find --regex?

    – VonC

    22. Juli 2014 um 13:35 Uhr

Benutzer-Avatar
VonC

Wie in “Gibt es eine Möglichkeit, Platzhalter mit zu verwenden git checkout?”

Git behandelt den Platzhalter nicht, Ihre Shell jedoch schon.

Wie unten angemerkt, müssten Sie das Platzhalterzeichen maskieren, damit Git es interpretieren kann: afile\*oder verwenden Sie einfache Anführungszeichen.

Das Beispielabschnitt von git checkout zeigt eine Wildcard-Verwendung:

rm hello.c
git checkout -- '*.c'

Beachten Sie die Anführungszeichen um *.c.
Die Datei hello.c wird ebenfalls ausgecheckt, obwohl es sich nicht mehr im Arbeitsbaum befindet, da das Dateiglobbing verwendet wird, um Einträge im Index (nicht im Arbeitsbaum von der Shell) abzugleichen.

Eine Alternative wäre zum Beispiel die Verwendung von find (wie in „“git add *.js” habe die Dateien nicht in Unterverzeichnisse hinzugefügt”)

find . -name '*js' -exec git checkout {} \;

Sie können Ihre Regex mit ausprobieren find -regex

Zum Beispiel verwendet Tukaz (aus den Kommentaren):

find ./packages/* -maxdepth 1 -name 'package.json' \
     -exec git checkout {} \; 

um nur die Kasse zu machen package.json von jedem Projekt, das ich habe und weglasse dist oder nodemodules Unterordner.


Der modernere Befehl (seit 2014) wäre Git 2.23+ (Q3 2019) git restore:

git restore -s=aBranch -- '*.c'

Mit ‘*.c’ nach dem in beschriebenen Glob-Muster pathspec.

  • MaxTiefe funktioniert gut! Danke

    – Tukaz

    14. Januar um 16:21 Uhr

  • @Tukaz Großartig! Was war das voll find Befehl, den Sie verwendet haben, mit -maxdepth?

    – VonC

    14. Januar um 16:23 Uhr

  • find ./packages/* -maxdepth 1 -name ‘package.json’ -exec git checkout {} \; um nur die package.json jedes Projekts auszuchecken, das ich habe, und zum Beispiel die Unterordner dist oder nodemodules wegzulassen

    – Tukaz

    15. Januar um 20:23 Uhr


  • @Tukaz Vielen Dank für das Feedback. Ich habe Ihren Kommentar zur besseren Sichtbarkeit in die Antwort aufgenommen.

    – VonC

    15. Januar um 20:49 Uhr

Ich habe diese Antwort nur aktualisiert, aber ich konnte es git checkout mit einem Platzhalter, also glaube ich, dass dies jetzt möglich ist. Ich verwende Git-Version 1.9.3.

  • Beachten Sie jedoch, dass das Sternchen maskiert werden muss: git checkout foo\*

    – Jamie Schembri

    28. Juli 2015 um 20:51 Uhr

Ich verwende eine solche Kombination von Befehlen.

Falls Sie eine Remote-Zweigstelle benötigen:

git checkout $(git branch -a | grep "your-key-words-here" | grep remotes)

Und falls Sie nur eine lokale Niederlassung benötigen:

git checkout $(git branch | grep "your-key-words-here")

Anwendungsbeispiel

Hauptsächlich Entwickler benennen Zweige nach Aufgabennummer von JIRA oder was auch immer, also können Sie mit diesen Befehlen schneller zu dem Zweig wechseln, den Sie brauchen.

(1) Alle verfügbaren Filialen vor Ort:

  • feature/CAN2-1035_new_calculation_for_internal_transfer
  • feature/CAN2-921_new_ui
  • entwickeln (aktuell)

Einschalten feature/CAN2-1035_new_calculation_for_internal_transfer branch, sollten Sie den Befehl eingeben:

git checkout $(git branch | grep CAN2-1035)

  • git branch – gibt alle lokalen Niederlassungen zurück (1)
  • grep CAN2-1035 – Filterergebnis von (1) und geben Sie nur diejenigen zurück, die CAN2-1035 enthalten

Diese Befehle könnten auch in einen Bash-Befehl extrahiert werden, um die Verwendung zu vereinfachen.

Gits Pfadspez Specials werden schlecht beworben, aber sie sind durchaus fähig:

git checkout ':!*.tmpl.*' app/\*.html

1158080cookie-checkwie man Regex im Befehl git checkout verwendet, um Dateiteilmengen anzugeben

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy