如何确定目录是否是一个有效的git目录而不需要git?

时间:2016-10-03 09:22:48

标签: git

stackoverflow中有很多问题询问如何确定是否 目录受git控制。答案是通过调用使用git命令 通过子进程命令。

我想知道的是我们如何确定目录是否是有效的git ?目录

git init命令在.git目录下创建这些文件:

config
description
HEAD
hooks
info
objects
refs

git init --bare同样如此。

假设我运行git init命令,然后删除/卸载git 我的系统。然后我想检查dir是否是git目录。显然,我不能 使用git rev-parse命令。因此,我怀疑需要通过检查这些文件来完成检查。在那些文件中需要存在.git目录 是一个有效的.git存储库?是否需要进行额外的检查?

更新详情:

这里我需要的是允许任何其他操作的最小检查 进一步。我不擅长解释。但是,假设我有两个函数(伪代码):

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仅在HEADrefsobjects有效时才有效 存在。那么,如果选中HEADrefsobjects就足够了吗?

2 个答案:

答案 0 :(得分:0)

很难用尽。

如果你想知道当前目录是.git目录还是完全不同的东西,只需检查主文件夹是否存在(info,objects,refs)。

如果您知道git是否会知道如何使用它,这意味着它不仅仅是归零文件,那么您将不得不开发一个git文件解析器......那么使用git会更容易。

答案 1 :(得分:0)

我认为.git目录的存在是一个不错的检查。 您可以查看解析配置和描述中的信息,如果您需要某种形式的repo验证,这些是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目录的存在。