2015-07-20 13 views
5

Potrzebuję wziąć kilka plików, które zmieniły się i scp je do różnych pudełek do testowania. Mam problem z wymyśleniem, jak sprawić, by git status dał mi listę taką jak ls -1, aby móc skryptować działania przy minimalnym wysiłku."status git" w krótkim lub krótkim formacie, np. "Ls -1"?

Mam istniejący skrypt, który robi to, czego potrzebuję, używając ls -1. Nie jestem utalentowanym skrypciarzem, więc nie chcę modyfikować scenariusza. Zamiast tego chciałbym, aby narzędzie zmodyfikowało jego wyniki.

Oczywiście, git status -1 nie działa. Format w How can I get 'git status' to always use short format nie jest zgodny z moim skryptem. I git status --column dał taki sam wynik jak poniżej.

Jak mam zmodyfikować listę plików, jeden do linii, tylko z zmodyfikowanym plikiem na linii?


$ git status 
On branch master 
Your branch and 'origin/master' have diverged, 
and have 1 and 2 different commits each, respectively. 
    (use "git pull" to merge the remote branch into yours) 

Changes to be committed: 
    (use "git reset HEAD <file>..." to unstage) 

    modified: cryptest.vcproj 
    modified: dlltest.vcproj 

Changes not staged for commit: 
    (use "git add <file>..." to update what will be committed) 
    (use "git checkout -- <file>..." to discard changes in working directory) 

    modified: adler32.cpp 
    modified: algebra.cpp 
    modified: algparam.cpp 
    modified: asn.cpp 
    modified: asn.h 
    modified: authenc.cpp 
    modified: authenc.h 
    modified: basecode.cpp 
    modified: cast.cpp 
    modified: ccm.cpp 
    modified: cmac.cpp 
    modified: config.h 
    modified: cryptdll.vcproj 
    modified: cryptlib.cpp 
    modified: cryptlib.h 
    modified: cryptlib.vcproj 
    modified: datatest.cpp 
    modified: dlltest.cpp 
    modified: eax.cpp 
    modified: ec2n.cpp 
    modified: eccrypto.cpp 
    modified: ecp.cpp 
    modified: emsa2.cpp 
    modified: eprecomp.cpp 
    modified: esign.cpp 
    modified: files.cpp 
    modified: filters.cpp 
    modified: filters.h 
    modified: fips140.cpp 
    modified: fipsalgt.cpp 
    modified: fltrimpl.h 
    modified: gf2_32.cpp 
    modified: gf2n.cpp 
    modified: gf2n.h 
    modified: gfpcrypt.cpp 
    modified: gfpcrypt.h 
    modified: hkdf.h 
    modified: hmac.cpp 
    modified: hrtimer.cpp 
    modified: ida.cpp 
    modified: idea.cpp 
    modified: integer.cpp 
    modified: iterhash.cpp 
    modified: luc.h 
    modified: misc.cpp 
    modified: misc.h 
    modified: modes.cpp 
    modified: modes.h 
    modified: nbtheory.cpp 
    modified: network.cpp 
    modified: oaep.cpp 
    modified: panama.cpp 
    modified: pkcspad.cpp 
    modified: polynomi.cpp 
    modified: pssr.cpp 
    modified: pubkey.h 
    modified: pwdbased.h 
    modified: queue.cpp 
    modified: rijndael.cpp 
    modified: rsa.cpp 
    modified: rw.cpp 
    modified: salsa.cpp 
    modified: seal.cpp 
    modified: secblock.h 
    modified: simple.h 
    modified: smartptr.h 
    modified: socketft.cpp 
    modified: socketft.h 
    modified: sosemanuk.cpp 
    modified: strciphr.cpp 
    modified: strciphr.h 
    modified: test.cpp 
    modified: validat1.cpp 
    modified: validat2.cpp 
    modified: vmac.cpp 
    modified: wait.cpp 
    modified: winpipes.cpp 
    modified: winpipes.h 
    modified: words.h 
    modified: xtr.cpp 
    modified: xtr.h 
    modified: zdeflate.cpp 
    modified: zinflate.cpp 

Odpowiedz

7

git status --porcelain

Wyjście wola w krótkim formacie, ale będą zgodne we wszystkich wersji Git.

git-status documentation

Oto fragment z odniesienia:

--porcelain
Daj wyjście w łatwego w parse formatu skryptów. Jest to podobne do krótkiego wyjścia, ale pozostanie stabilne w wersjach Git i niezależnie od konfiguracji użytkownika.

+0

To nadal nie powiela danych wyjściowych z 'ls -1'. Chcesz odrobinę rozwinąć swoją odpowiedź? – ghoti

+0

Dzięki. Jest blisko, ale na linii są dodatkowe znaki. Chcę jednego pliku wymienionego w jednym wierszu. – jww

+0

Niestety nie sądzę, że możesz już zmniejszyć to wyjście. 'git-status' nie wyświetla tylko plików. Daje znacznie więcej informacji niż to, więc poza skróceniem wyjścia z tą opcją, twoim najlepszym (i chyba tylko opcją) jest po prostu niestandardowa logika parsowania. –

2

Zgodnie z sugestią Thomasa, opcja --porcelain jest tym, czego potrzebujesz. Ale oczywiście, aby uzyskać JEDŹ nazwę pliku zmodyfikowanych plików, musisz również przeanalizować to wyjście. Na przykład, rurociągi wyjście za pomocą prostego skryptu sed jak to może działać:

git status --porcelain | sed -ne '/^M */s///p' 

Skrypt wyszukuje M i spacji na początku linii. Jeśli zostaną znalezione, zostaną usunięte, a linia zostanie wydrukowana. Jeśli nie zostaną znalezione (tj. Wynik jest inny niż zaklasyfikowany plik M), żadne dane wyjściowe nie są wyświetlane.

Dane wyjściowe powyższego wiersza poleceń powinny być niemal równoważne z danymi z ls -1 - czyli z listą plików bez żadnych innych informacji. Zauważ, że --porcelain kończy nazwy plików z wartością NULL, więc jeśli dane wyjściowe nie działają zgodnie z oczekiwaniami, możesz potrzebować obsługiwać to w swoim skrypcie lub w innej rurze. (Przeczytaj o xargs(1)).

+0

Twoja odpowiedź nie obejmuje wszystkich przypadków. Tylko pliki w pełni zestopywowane mają wyjście z 'git status --porcelain', które jest obsługiwane przez' sed'. Jeśli dany plik został zmodyfikowany, ale nie jest zapisany w postaci, wynik będzie wyglądał jak "M an_unstaged_file" (z miejscem na początku) .Nawet lepiej, jeśli plik zawierałby zarówno partycje etapowane, jak i nieparametrowane, wyjściem byłby plik 'MM an_startowany_i plik_programowy'. – werkritter

2

Jeśli masz Unstaged zmian można wymienić wszystkie dotykane pliki na liście jednokolumnowym podobny do ls -1 z tym poleceniem:

git ls-files --modified --others --exclude-standard --directory

Opcja --modified znajdują zmodyfikowanych plików i --others opcja powoduje wyświetlenie inne nieśledzone pliki, takie jak nowe pliki; --exclude-standard ignoruje wykluczone pliki, a --directory wyświetla tylko nazwy katalogów, a nie pliki wewnątrz nich. Więcej informacji można znaleźć w documentation.

Oto polecenie używam szybko skopiować wszystkie zmodyfikowane i nowe pliki do mojego katalogu temp zachowując pełną ścieżkę (brudny alternatywą git stash):

git ls-files --modified --others --exclude-standard --directory | xargs -I {} cp --parents {} ~/temp 

Jeśli już dodane pliki do git zostać popełnione (np git add -A .), wówczas można użyć polecenia w przyjętym odpowiedź i wyciąg drugą kolumnę aby uzyskać prostą listę plików:

git status --porcelain | awk '{ print $2 }'

Jeśli chcesz odfiltrować wiersze według stanu git, można zrobić coś takiego:

git status --porcelain | grep ^[AM] | awk '{ print $2 }'

Daje listę zawierającą tylko zmodyfikowany (M) oraz nowo dodanej (A) plików .


Aktualizacje:

  • sugestia Added @ jotik użytkownika.
+1

'git ls-files --modified --others --exclude-standard --directory' może dać lepsze wyniki, biorąc pod uwagę pliki excit git i nie powracając do katalogów nie znajdujących się pod kontrolą wersji. – jotik

1

W przypadku listy zmodyfikowanych plików pomocne mogą być poniższe polecenia.

git diff --name-only

lub

git diff --name-status

Int wyjściu --name statusie, status (A, M, D), i plik ścieżka jest oddzielona od zakładki, można je przetwarzać komendą cut.

Jeśli można uzyskać listę plików również przy przemieszczaniu, można użyć opcji `--cache '.

Powiązane problemy