2013-04-26 10 views
103

.gitignore może zignorować całe pliki, ale czy istnieje sposób, aby zignorować określone linie kodu podczas kodowania?Jak powiedzieć git, aby ignorować poszczególne linie, np. Gitignore dla określonych linii kodu

Często i wielokrotnie dodajemy te same linie debugowania do projektu, tylko aby pamiętać o usunięciu ich przed wykonaniem. Chciałbym po prostu zachować linie w kodzie i git je pomijać.

+37

nie mogę powiedzieć, czy jest to fatalny pomysł genialny jeden lub . –

+0

@ KyleStrand co najmniej, mogę dodać go do debugowania linii, które wpisuję i czuć się bezpiecznie wiedząc, że nie zostaną przypadkowo popełnione. – Kache

+4

Dobrze, to jest "genialna" część. –

Odpowiedz

91

ten sposób można niby zrobić z git filters:

  1. Tworzenie Plik/Otwórz gitattributes.
    • < projekt root>/gitattributes (zostanie oddany do repo)
      LUB
    • < pierwiastek projektu> /. Git/info/attributes (nie zostanie zatwierdzony do repozytorium)
  2. Dodaj linia określająca pliki mają być filtrowane:
    • *.rb filter=gitignore, tj uruchomić filtr o nazwie gitignore wszystkich *.rb plików
  3. Zdefiniuj filtr gitignore w gitconfig:
    • $ git config --global filter.gitignore.clean "sed '/#gitignore$/'d", czyli usunąć te linie
    • $ git config --global filter.gitignore.smudge cat, czyli nic nie rób podczas wyciągania pliku z repo

Uwagi:
Oczywiście, to dla plików rubin, stosowana gdy linia kończy #gitignore, stosowane na całym świecie w ~/.gitconfig. Zmodyfikuj to jednak, jeśli potrzebujesz do swoich celów.

Ostrzeżenie!
Powoduje to, że plik roboczy różni się od repozytorium (oczywiście). Każde sprawdzenie lub przebicie oznacza, że ​​linie te zostaną utracone! Ta sztuczka może wydawać się bezużyteczna, ponieważ linie te są wielokrotnie tracone przy kasie, ponownym uruchomieniu lub pociągnięciu, ale mam konkretny przypadek użycia, aby z niego skorzystać.

Wystarczy git stash save "proj1-debug"podczas gdy filtr jest nieaktywna (tylko tymczasowo wyłączyć go w gitconfig czy coś). W ten sposób mój kod debugowania zawsze może być git stash apply 'd do mojego kodu w dowolnym momencie bez obawy, że linie te zostaną przypadkowo popełnione.

Mam pomysł na radzenie sobie z tymi problemami, ale spróbuję go wdrożyć w innym czasie.

Dzięki Rudi i jw013 za wzmiankę o filtrach git i gitattributes.

+2

Wow. To jest niesamowite. – rjmunro

+2

Nie powinno to być: 'git config --global filter.gitignore.clean sed '/ # gitignore $/d'', ponieważ nazwa filtra "gitignore" –

+0

Ah rzeczywiście. W rzeczywistości istnieje również kwestia uniknięcia oferty cenowej. – Kache

12

Miałem podobny problem z pisaniem kodu java. Moje rozwiązanie było oznaczyć kod, który nie chciał popełnić, a następnie dodać pre-commit, które wyglądają na mój znaczników:

#!/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 
+0

Markup zdecydowanie wydaje się mniej przerażającym rozwiązaniem i deklaratywnym, niż filtrowanie oparte na "sed" lub podobne. Niezłe. – akshay

Powiązane problemy