it-swarm.com.de

Wie man git anweist, einzelne Zeilen zu ignorieren, d. H. Gitignore für bestimmte Codezeilen

.gitignore kann ganze Dateien ignorieren, aber gibt es eine Möglichkeit, bestimmte Codezeilen beim Codieren zu ignorieren?

Ich füge häufig und wiederholt dieselben Debug-Zeilen in ein Projekt ein, nur um mich vor dem Festschreiben daran zu erinnern, sie zu entfernen. Ich möchte einfach die Zeilen im Code behalten und sie ignorieren.

144
Kache

So kannst du es machen mit Git Filter :

  1. Gitattributes-Datei erstellen/öffnen:
    • <project root>/.gitattributes (Wird in das Repo übernommen)
      ODER
    • <project root>/.git/info/attributes (Wird nicht in das Repo übernommen)
  2. Fügen Sie eine Zeile hinzu, die die zu filternden Dateien definiert:
    • *.rb filter=gitignore, D. H. Filter mit dem Namen gitignore für alle *.rb - Dateien ausführen
  3. Definieren Sie den Filter gitignore in Ihrem gitconfig:
    • $ git config --global filter.gitignore.clean "sed '/#gitignore$/'d", D. H. Diese Zeilen löschen
    • $ git config --global filter.gitignore.smudge cat, D. H. Nichts tun, wenn eine Datei aus dem Repo gezogen wird

Anmerkungen:
Dies gilt natürlich für Ruby Dateien, die angewendet werden, wenn eine Zeile mit #gitignore Endet, global angewendet in ~/.gitconfig. Ändern Sie dies jedoch Sie brauchen für Ihre Zwecke.

Warnung!!
Dadurch unterscheidet sich Ihre Arbeitsdatei (natürlich) vom Repo. Jedes Auschecken oder Umbasieren bedeutet, dass diese Leitungen verloren gehen! Dieser Trick mag nutzlos erscheinen, da diese Zeilen beim Auschecken, Zurücksetzen oder Ziehen wiederholt verloren gehen, aber ich habe einen bestimmten Anwendungsfall, um ihn zu nutzen.

Nur git stash save "proj1-debug", während der Filter inaktiv ist (deaktivieren Sie ihn nur vorübergehend in gitconfig oder so). Auf diese Weise kann mein Debug-Code jederzeit git stash apply In meinen Code eingefügt werden, ohne dass befürchtet wird, dass diese Zeilen versehentlich übergeben werden.

Ich habe eine mögliche Idee, um mit diesen Problemen umzugehen, aber ich werde versuchen, es ein anderes Mal zu implementieren.

Vielen Dank an Rudi und jw013 für die Erwähnung von Git-Filtern und Gitattributen.

127
Kache

Ich hatte ein ähnliches Problem beim Schreiben von Java Code. Meine Lösung bestand darin, Code zu markieren, den ich nicht festschreiben wollte, und dann einen Pre-Commit-Hook hinzuzufügen, der nach meinem Markup suchen würde:

#!/bin/bash
#
# This hook will look for code comments marked '//no-commit'
#    - case-insensitive
#    - dash is optional
#    - there may be a space after the //
#
noCommitCount=$(git diff --no-ext-diff --cached | egrep -i --count "(@No|\/\/\s?no[ -]?)commit")
if [ "$noCommitCount" -ne "0" ]; then
   echo "WARNING: You are attempting to commit changes which include a 'no-commit'."
   echo "Please check the following files:"
   git diff --no-ext-diff --cached --name-only -i -G"(@no|\/\/s?no-?)commit" | sed 's/^/   - /'
   echo
   echo "You can ignore this warning by running the commit command with '--no-verify'"
   exit 1
fi
21
Mike