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
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ładfoo/bar/README
) względem katalogu głównego repozytorium.
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
Świetne rzeczy! Naprawdę pomocny –
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 =
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
Precyzyjnie, dzięki. Włączyłem to do odpowiedzi. – earl