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
仅在HEAD
,refs
和objects
有效时才有效
存在。那么,如果选中HEAD
,refs
和objects
就足够了吗?
答案 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目录的存在。