2016-10-03 68 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目錄的存在上去的樹。

相關問題