2016-10-03 38 views
3

在stackoverflow中有很多问题,询问如何确定一个目录是否在git控制之下 。答案是使用git命令,通过子进程调用 命令。如何确定一个目录是否是一个有效的git目录而不需要git?

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

config 
description 
HEAD 
hooks 
info 
objects 
refs 

这同样与git init --bare

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

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

UPDATE细节:

我需要通过这里有效的最低检查允许任何其他操作 进一步。我不善于解释。但是,让我们说,我有两个函数(伪代码):

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,refsobjects是 存在。那么,如果检查HEAD,refsobjects就足够了?

+0

取决于“有效”的含义。 – 1615903

+0

定义“有效”。如果某些Git对象损坏,可以吗?如果* all * Git对象损坏怎么办?在声明该目录无效之前,您希望允许多少“与”目录“错误”? – torek

回答

0

这是很难穷尽。

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

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

0

我觉得.git目录的存在是一个体面的检查开始。 你可以看看解析配置和描述中的信息,如果你需要某种形式的回购验证,这些都是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目录的存在上去的树。

相关问题