Как определить, является ли каталог допустимым каталогом git, не требуя git?

#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 .