2012-02-24 11 views
16

Rozglądałem się za duplikatami i chociaż niektóre z nich mają podobne tytuły, nie znalazłem nikogo, kto miałby taki sam problem jak ja, więc tutaj idzie.Jak dodać plik do indeksu w haku git pre-commit

Napisałem skrypt, który działa na pre-commit i wykorzystuje dane wyjściowe z git status --porcelain do kompilowania dowolnego pliku LESS w moim projekcie, który się zmienił. Ta część działa dobrze. Ale chcę, aby pliki .css zostały włączone do bieżącego zatwierdzenia. Tak więc oprócz uruchamiania kompilatora, mój skrypt uruchamia git add <filename>. A tutaj sprawy stają się trudne.

Plik jest dodany do indeksu, ale nie jest indeksem bieżącego zatwierdzenia. Więc jeśli zmodyfikuję style.less i uruchomię git commit -a (lub ręcznie) kompilator powinien wygenerować style.css i style.min.css i dodać je do bieżącego zatwierdzenia. Ale zachowanie, które zauważyłem, to tylko style.less, pomimo dwóch plików .css dodawanych do indeksu dla następnego zatwierdzenia.

Moje pytanie brzmi: czy istnieje sposób dodawania plików do zatwierdzenia w haczyku przed zatwierdzeniem, aby zostały zastosowane do tego zatwierdzenia? Zauważ, że przed uruchomieniem hook przed zatwierdzeniem te dwa pliki .css nie są modyfikowane, więc nie mogę po prostu dodać ich wcześniej. Wiem również, że mogę wyjść z haka z niezerowym stanem, więc zatwierdzenie zostanie anulowane, ale pliki zostaną dodane, ale mam nadzieję, że tego uniknę. Jakieś lepsze pomysły?

Odpowiedz

-3

Dlaczego chcesz to zrobić w pierwszej kolejności? Próbujesz włączyć wygenerowane pliki do kontroli wersji, co w ogóle jest nie tak dobrym pomysłem. Jeśli potrzebujesz pliku style.min.css przy kasie, dlaczego nie możesz go wygenerować po realizacji transakcji w kroku kompilacji?

+0

Ponieważ pliki CSS nie są plikami binarnymi, są to tylko statyczne pliki tekstowe. Wygenerowane pliki nie są umieszczane w kontroli wersji, ponieważ zwykle powodują konflikty scalania, w których naprawdę nie ma dobrego sposobu na ich rozwiązanie (pliki binarne), ale w przypadku plików CSS rzadko występuje taki problem. Nie chciałem instalować kompilatora LESS na naszych serwerach internetowych, aby zrobić to po scaleniu/aktualizacji. Jednak wszystko, co powiedzieliśmy, okazało się łatwiejszym sposobem na osiągnięcie tego, co próbowałem zrobić, mimo że nie było idealne. –

+1

Dlaczego jest to zaakceptowana odpowiedź? To wcale nie rozwiązuje problemu. – frhd

+1

Sądzę, że przyjął moją "twoją niewłaściwą" odpowiedź, ponieważ w tym przypadku rozwiązał on swój problem (prawdopodobnie bez odpowiedzi na jego pytanie). Jeśli nie sprawdza plików LESS w pierwszej kolejności, problem "jak je przełączyć do zadania" zniknie. – plaugg

0

Zdarza mi się, że atrybut git "clean" może być skryptem aktualizującym wygenerowane pliki. Zwykle ten hak może uruchomić skrypt, aby uporządkować kod źródłowy, ale myślę, że może być użyty do "wyczyszczenia" wygenerowanych danych wyjściowych. Ten atrybut jest wywoływany, gdy robisz "git add" i możesz mieć skrypt do wykonania innego "git add" na wygenerowanym pliku.

+0

Czy możesz więcej o tym powiedzieć? Zrobiłem trochę Googling i znalazłem kilka informacji na temat atrybutów Git, ale nie ma nic, jak dołączyć do nich skrypt lub jak można określić atrybut 'add'. –

0

Możesz skorzystać z modyfikacji ostatniego zatwierdzenia. Tylko pomysł.

+0

Zależało mi na tej opcji, ale mam nadzieję, że jej uniknę. Polega na uruchomieniu zatwierdzenia, uruchomieniu haka, a następnie zezwoleniu na ukończenie oryginalnego zatwierdzenia, a następnie uruchomieniu drugiego zatwierdzenia (chyba że czegoś brakuje), co wydaje się być skomplikowane w wykonaniu ręcznym i śmieszne w automatycznym użyciu haków. –

+0

Chociaż automatycznie uruchamiany przez hak, wykona to zadanie bezbłędnie. – Xobb

10

Nie mogę odtworzyć Twojego problemu. Początkowo domyślam się, że zmienna środowiskowa GIT_INDEX_FILE została rozbrojona przez twój hak pre-commit. Jednak gdy próbowałam rozbrojenie GIT_INDEX_FILE z pre-commit, dostałem inny problem (Git skarżył się, że .git/index został zablokowany).

Oto przykładowy skrypt pokazujący, że Git działa zgodnie z oczekiwaniami i że coś innego musi być nie tak. Skrypt ten inicjuje nowe repozytorium testowego tworzy pre-commit hak, który emuluje co robi hak, i sprawia, że ​​niektóre testy zobowiązuje:

#!/bin/sh 

# initialize the test repository 
rm -rf testrepo 
git init testrepo 
cd testrepo 

# create the pre-commit hook 
cat <<\EOF >.git/hooks/pre-commit 
#!/bin/sh 
git status --porcelain | while IFS= read -r line; do 
    # todo: handle renames and deletions of a *.less file 
    f=${line#???} 
    case ${f} in 
     *.less) 
      fb=${f%.less} 
      echo bar >>"${fb}".css 
      echo baz >>"${fb}".min.css 
      git add "${fb}".css "${fb}".min.css 
      ;; 
    esac 
done 
EOF 
chmod +x .git/hooks/pre-commit 

# create foo.less, commit it 
echo foo >foo.less 
git add foo.less 
git commit -m "add foo.less" 

# modify foo.less, commit it 
echo foo2 >>foo.less 
git commit -a -m "modify foo.less" 

Jeśli prowadzisz git log -p w repozytorium testowym i spojrzeć na wynikowej zobowiązuje, ty” Zobaczysz, że i foo.min.css zostały zmodyfikowane po zmodyfikowaniu foo.less.

Oto dlaczego myślałem problem został spowodowany przez zmianę/wyłączania zmienną GIT_INDEX_FILE środowiska:

Kiedy git commit -a jest prowadzony, Git sprawia plik indeksu czasowego i wykorzystuje te zamiast domyślnego .git/index stworzyć commit. Aby operacje takie jak git add działały z poziomu haka pre-commit, Git ustawia zmienną środowiskową GIT_INDEX_FILE na nazwę indeksu tymczasowego utworzonego przed uruchomieniem pre-commit.Jeśli twój hak rozłączy GIT_INDEX_FILE lub ustawi go na .git/index, wtedy wszystkie operacje Git z twojego haka będą próbowały zmodyfikować oryginalny indeks, a nie tymczasowy indeks, który jest używany do generowania zatwierdzenia.

Jednak tymczasowy plik indeksu działa również jako blokada oryginalnego pliku indeksu. Jeśli hak spróbuje zmodyfikować oryginalny indeks, a tymczasowy indeks istnieje, to Git przerwie z błędem.

+0

Uruchomiłem skrypt i działało zgodnie z oczekiwaniami, w przeciwieństwie do tego, jak zachowuje się moje prawdziwe repozytorium. Zajmę się tym trochę później i wrócę do ciebie, jeśli coś wymyślę. Dzięki! –

+0

Dałem ci nagrodę za wysiłek, mimo że wciąż nie mogłem zrozumieć, co się dzieje. Dzięki jeszcze raz! –

Powiązane problemy