2010-11-09 18 views
14

Czy istnieje sposób sprawdzenia, czy plik pod określoną, względną ścieżką istnieje w pilocie? Nie mam nic przeciwko pobieraniu informacji, jeśli jest to jedyna opcja. Innymi słowy szukam plików git-ls z opcją określenia zdalnego i rozgałęzionego. Jestem zainteresowany tylko, jeśli plik istnieje (listę plików na oddziale zrobi, jak również), nie dbam o skrótów, diffs itpJak sprawdzić, czy plik istnieje w pilocie?

Odpowiedz

22

Można użyć

git cat-file -e <remote>:<filename> 

który będzie wyjdź z zero, gdy plik istnieje. Zamiast <remote> powyżej użyjesz nazwy zdalnego oddziału (ale może to być faktycznie dowolne odwołanie do obiektu drzewa). Aby użyć takiej zdalnej gałęzi, musisz skonfigurować i pobrać zdalne repozytorium (tj. Za pomocą git remote add + git fetch).

Konkretny przykład:

$ git cat-file -e origin/master:README && echo README exists 
README exists 

$ git cat-file -e origin/master:FAILME 
fatal: Not a valid object name origin/master:FAILME 

Dwie rzeczy do uwaga:

  • Zastosowanie / jako separatora ścieżki w nazwach plików, nawet na przykład Windows.
  • <filename> to pełna ścieżka (na przykład foo/bar/README) względem katalogu głównego repozytorium.
+1

Według '' masz na myśli zdalny oddział, co oznacza, że ​​musisz go skonfigurować zdalne i uruchom 'git fetch ' pierwszy; badasz oddział zdalny w repozytorium, więc musisz się upewnić, że jest on aktualny. – Cascabel

+0

Precyzyjnie, dzięki. Włączyłem to do odpowiedzi. – earl

6

Można użyć git archive dostęp do poszczególnych plików bez pobierania żadnej innej części repozytorium:

if git archive --format=tar \ 
       --remote=<remote_name-or-URL> master README >/dev/null; then 
    echo 'master has README' 
else 
    echo 'master does not have README (or other error)' 
fi 

Usługa archiwum (upload-archive) nie mogą być włączone na wszystkich serwerach lub repozytoriów choć, trzeba będzie przetestować go pod kątem serwerów i repozytoriów, do których musisz uzyskać dostęp.

Jeśli usługa archiwizacji nie jest dostępna, będziesz musiał pobrać obiekty w normalny sposób.

Jeśli nie masz jeszcze zdalnej konfiguracji dla danego repozytorium, możesz wykonać "płytkie" pobranie w FETCH_HEAD (musi to być zrobione w repozytorium Git, ale może być całkowicie niepowiązane lub nawet puste):

git fetch --depth=1 remote_name-or-URL master 
if git rev-parse --verify --quiet FETCH_HEAD:README >/dev/null; then 
    echo "repository's master has README" 
else 
    echo "repository's master does not have README" 
fi 

Jeśli zdalny zdefiniowane dla repozytorium, to prawdopodobnie po prostu chcesz zaktualizować go i uzyskać dostęp do pliku poprzez normalne zdalne śledzenie oddziałów:

git fetch remote_name 
if git rev-parse --verify --quiet remote_name/master:README >/dev/null; then 
    echo "remote's master has README" 
else 
    echo "remote's master does not have README" 
fi 
+0

Świetne rzeczy! Naprawdę pomocny –

+1

Ostrzegam: rozwiązanie 'git-archive' nie działa niezawodnie. wydaje się, że sprawdza tylko istnienie plików/katalogów najwyższego poziomu, np .: 'git archive --remote = master dir-że-istnieje/then/some/nonsense/path' zakończyłoby się z 0 –

Powiązane problemy