2014-03-03 37 views
2

我正在写保险丝(Linux)的git包装来访问git存储库,如普通文件和目录。如何提交到裸仓库?

访问文件夹和文件的分支机构,标签和提交工作得很好,但我犯了一个奇怪的行为,当我提交文件。

我做了以下styff:

  • 创建一个流的新斑块(磁盘上的temporaney文件)
  • 创建一个新的TreeDefinition
  • 创建一个新的树
  • 创建ObjectDatabase中的新提交
  • 更新分支引用新提交

之后,我更新分支裁判,我只查看更新的文件,没有别的!

在这里有代码

 String referenceName = null; 
     IEnumerable<Commit> parentCommit = null; 

     // Riposiziona il puntatore dello stream all'inizio 
     openedHandle.Stream.Seek(0, SeekOrigin.Begin); 

     // Crea il blob 
     Blob blob = this.repository.ObjectDatabase.CreateBlob(openedHandle.Stream); 

     // Acquisisce la path rimuovendo le prime due parti della path 
     List<string> pathParts = new List<string>(openedHandle.Path.Split('/')); 
     pathParts.RemoveRange(0, 3); 

     // Inserisce il blob in un tree 
     TreeDefinition treeDefinition = new TreeDefinition(); 
     treeDefinition.Add(String.Join("/", pathParts), blob, Mode.NonExecutableFile); 
     Tree tree = this.repository.ObjectDatabase.CreateTree(treeDefinition); 

     // Inizializza l'autore ed il commiter 
     Signature committer = new Signature("My Name", "[email protected]", DateTime.Now); 
     Signature author = committer; 

     // Acquisisce l'elenco dei commits 
     switch (openedHandle.PathType) 
     { 
      case PathType.Branches: 
       Branch branch = this.GetBranchByPath(openedHandle.Path); 
       referenceName = branch.CanonicalName; 
       parentCommit = branch.Commits; 
       break; 

      default: 
       throw new Exception("Can update only branches"); 
     } 

     // Crea il commit 
     Commit commit = this.repository.ObjectDatabase.CreateCommit(
      author, 
      committer, 
      (openedHandle.New ? String.Format("{0} created", openedHandle.Path) : String.Format("{0} updated", openedHandle.Path)) + "\r\n", 
      false, 
      tree, 
      parentCommit); 

     // Aggiorna il riferimento del target 
     this.repository.Refs.UpdateTarget(this.repository.Refs[referenceName], commit.Id); 

回答

4

TreeDefinition treeDefinition = new TreeDefinition()将创建一个空TreeDefinition。因此,当您向其添加Blob时,最终创建的Tree将仅包含一个条目。

TreeDefinition.From()静态帮助程序的方法可能会帮助你在这里。它将允许从现有的CommitTree的实际内容创建TreeDefinition

标准过程将建立从一个Commit一个TreeDefinition,更新TreeDefinition(通过添加/移除从它的条目),从中创建一个Tree并最终新Commit其中父将CommitA

您可以在此test这表明情况下,这个确切用法(注采取偷看:测试没有实际更新HEAD引用,使其指向新创建的承诺,但你的代码确实已经解决这个)。

+0

我错过了TreeDefinition.From帮助器的方法,谢谢!现在,我必须了解为什么单熔丝在我尝试创建文件时出错!谢谢 –