#git
#git
Вопрос:
В stackoverflow много вопросов о том, как определить, находится ли каталог под контролем git. И ответ заключается в использовании git
command путем вызова command через дочерний процесс.
Я хочу знать, как мы можем определить, является ли каталог допустимым каталогом git?
git init
команда создает эти файлы в .git
каталоге:
config
description
HEAD
hooks
info
objects
refs
То же самое относится и к git init --bare
.
Допустим, я запускаю git init
command, а затем git
удаляю / удаляю из своей системы. И затем я хочу проверить, является ли git
каталог dir. Очевидно, я не могу использовать git rev-parse
command . Итак, я подозреваю, что проверку необходимо выполнить, проверив эти файлы. В этих файлах должно быть то, что там должно быть, чтобы .git
каталог был допустимым .git
репозиторием? И нужно ли выполнять какие-либо дополнительные проверки?
Подробности ОБНОВЛЕНИЯ:
Что мне нужно для valid здесь, так это минимальная проверка, позволяющая выполнять любые другие операции в дальнейшем. Я не умею объяснять. Но, допустим, у меня есть две функции (псевдокод):
fn is_valid(gitdir) {
// here will happens checking if a git dir is valid. it doesn't care
// if any content is corrupted.
return valid;
}
fn current_branch(gitdir) {
// here will show current branch. but, will only run if the gitdir
// is valid
// this function will read 'refs' directory
return current;
}
fn list_branches(gitdir) {
// here will list of branches. but, will only run if the gitdir is valid
// this function will read 'refs/heads'
return branches;
}
Если я проверю только .git
каталог, он не будет работать в bare
репозитории. Затем я
обнаружил, что git rev-parse
это будет работать только в том случае, если HEAD
refs
и objects
существуют. Итак, если проверка HEAD
refs
и objects
достаточна?
Комментарии:
1. Зависит от того, что вы подразумеваете под «допустимым».
2. Определите «допустимый». Нормально ли, если некоторые объекты Git повреждены? Что, если все объекты Git повреждены? Насколько вы хотите, чтобы каталог был «неправильным», прежде чем объявить его недействительным?
Ответ №1:
Довольно сложно быть внимательным.
Если вы хотите знать, является ли текущий каталог .git
каталогом или чем-то совершенно другим, просто проверьте наличие основных папок (info, objects, refs).
Если вы хотите знать, будет ли git знать, как с ним работать, то есть это не просто обнуленные файлы, тогда вам придется разработать анализатор файлов git… тогда было бы проще просто использовать git.
Ответ №2:
Я думаю, что существование каталога .git является достойной проверкой для начала. Вы могли бы посмотреть на анализ информации в config и description, это текстовые файлы ASCII, если вам нужна какая-либо форма проверки репозитория.
.git>$ ls -l | grep -v ^d | grep -v total | awk '{print "file " $9}' | sh
COMMIT_EDITMSG: ASCII English text
COMMIT_EDITMSG~: ASCII English text
config: ASCII text
description: ASCII English text
FETCH_HEAD: ASCII text
gitk.cache: ASCII text, with very long lines
HEAD: ASCII text
index: data
ORIG_HEAD: ASCII text
packed-refs: ASCII text
Если вы хотите узнать, находится ли данный каталог в репозитории git, вы создадите дерево каталогов и подниметесь по дереву, пока не столкнетесь с существованием каталога .git .