2014-01-09 35 views
0

有一個sha值代表當前狀態下git倉庫的狀態嗎?sha值表示git倉庫的狀態

每次更新對象數據庫並更新參考時,sha值將被更新,如果git具有此sha值,則更改參考值。

換句話說,sha值表示整個存儲庫的當前版本。

這是我的代碼,用於計算當前引用的sha。有一個git級別的API或接口?

private string CalcBranchesSha(bool includeTags = false) 
{ 
    var sb = new StringBuilder(); 
    sb.Append(":HEAD"); 
    if (_repository.Head.Tip != null) 
     sb.Append(_repository.Head.Tip.Sha); 
    sb.Append(';'); 
    foreach (var branch in _repository.Branches.OrderBy(s => s.Name)) 
    { 
     sb.Append(':'); 
     sb.Append(branch.Name); 
     if (branch.Tip != null) 
      sb.Append(branch.Tip.Sha); 
    } 
    sb.Append(';'); 
    if (includeTags) 
    { 
     foreach (var tag in _repository.Tags.OrderBy(s => s.Name)) 
     { 
      sb.Append(':'); 
      sb.Append(tag.Name); 
      if (tag.Target != null) 
       sb.Append(tag.Target.Sha); 
     } 
    } 
    return sb.ToString().CalcSha(); 
} 
+0

你是指當前版本的代碼或存儲庫? – user1937198

+0

@ user1937198是的 – Aimeast

+0

哪一個?如果你的代碼只是取最近一次提交的哈希值。一個提交包含父項的散列。 – user1937198

回答

1

有一個SHA值代表了在當前狀態的Git倉庫的狀態?

在git的說法中,存儲庫的狀態通常是指工作目錄,索引和當前HEAD提交之間存在差異的路徑。

但是,它看起來並不像你在此之後。根據我的理解,你試圖計算一個校驗和來表示當前庫的狀態(即你的分支和標籤指向什麼)。

關於代碼,它可能會在某些方面加以改進,以獲得更精確的校驗:

  • 賬戶的所有引用的資料庫(refs/tagsrefs/heads旁)(認爲refs/stashrefs/notes或產生當一個人重寫存儲庫的歷史記錄時,在refs/original中備份引用)。
  • 考慮從直接引用中區分符號。 (即:HEAD->master->08a4217應導致不同的校驗比HEAD->08a4127

低於與以上兩點交易代碼的修改版本,通過利用Refs命名空間:

private string CalculateRepositoryStateSha(IRepository repo) 
{ 
    var sb = new StringBuilder(); 

    sb.Append(":HEAD"); 
    sb.Append(repo.Refs.Head.TargetIdentifier); 
    sb.Append(';'); 

    foreach (var reference in repo.Refs.OrderBy(r => r.CanonicalName)) 
    { 
     sb.Append(':'); 
     sb.Append(reference.CanonicalName); 
     sb.Append(reference.TargetIdentifier); 
     sb.Append(';'); 
    } 

    return sb.ToString().CalcSha(); 
} 

請保持請記住以下限制:

  • 這不考慮對索引或工作日的更改(例如山姆e校驗和將返回一個文件已被暫存或不)
  • 有方法可以在對象數據庫中創建對象而不修改引用。上述代碼不會反映這些更改。一種可能的破解方式可能是在StringBuuilder之後追加對象數據庫中的對象數(即repo.ObjectDatabase.Count()),但這可能會阻礙整體性能,因爲這會枚舉每次校驗和時的所有對象被計算)。

有一個git級API或接口?

我不知道git中有任何等效的本地函數(雖然類似的結果可能通過一些腳本實現)。在libgit2或Libgit2Sharp API中沒有任何本地特性。

+0

更多問題,我是否需要對參考名稱進行排序? – Aimeast

+0

好點!檢索參考文件的順序取決於底層存儲輸出它們的方式。訂購它們會使我的建議更加強大。感謝您注意到了這一點。我會盡快更新答案以反映這一點。 – nulltoken