正确的分阶段文件和提交方式

时间:2013-04-20 17:08:58

标签: libgit2sharp

当我尝试执行以下操作时,我最终会生成空提交;也就是说,它会创建一个没有任何改变的提交。

string filename = "path/to/file";
repo.Index.Stage(filename);
repo.Commit();

请注意路径是相对的,这意味着,我使用Repository创建我的Repository repo = new Repository(".");然后使用路径(上面称为文件名),如 ".gitignore""files/text.txt"做正确的方法,但它不起作用。

演示此“在行动中”的代码可以在完整here中找到,但基本上是这样运行的:

int count = 0;
//iterate all entries in the index (correct me if i'm wrong, but this should be all the changed files? or is it just all the files..)
//this is in AddWindow.cs
foreach (LibGit2Sharp.IndexEntry entry in vcs.GetRepository().Index)
        {
            //store an the entry.Path as Representation in an Object FileToggle
            toggles[count] = new FileToggle(entry.Path);
            count++;
        }

//then later, we do this (also in AddWindow.cs)
foreach (FileToggle f in toggles)
        {
            if (f.GetToggle()) //this is a bool set by user, so lets assume its on
                vcs.GetRepository().Index.Stage(f.GetRepresenation()); //stage all selected files, using their representation (ie entry.Path set above)
        } 

//and then finally, later, we do this in CommitWindow.cs
   if (message != null && signature != null && email != null)
                    vcs.GetRepository().Commit(message, new LibGit2Sharp.Signature(signature, email, System.DateTimeOffset.Now), new LibGit2Sharp.Signature(signature, email, System.DateTimeOffset.Now));

同样重要的是要注意vcs.GetRepository()返回Repository 您还可以看到一些空白提交的示例,因为我使用该工具进行尝试 承诺自己。看一个here

此外,我已经验证我正在尝试使用git status暂存然后提交在命令行中标记为已修改的文件。所以,我不只是尝试提交未修改的文件,也不提交已经上传的文件。我(据我所知)尝试对需要更新的文件执行此.Stage() .Commit()进程。

更新

根据nulltoken的要求:

  

在行调用之前添加Console.WriteLine(string.Format(“{0} - {1}”,f.GetRepresenation(),vcs.GetRepository()。Index.RetrieveStatus(f.GetRepresenation()))) Index.Stage()。

暂存我的“测试”文件时得到的输出是

Assets\editor\GitTool\AddWindow.cs - Modified
Assets\editor\GitTool\CommitWindow.cs - Modified
  

在执行repo.Commit调用的行上添加断点   运行代码。当您点击断点时,请对vcs.GetRepository()指向的存储库运行git status

这会产生指示

的git状态的输出
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   Assets/editor/GitTool/AddWindow.cs
#       modified:   Assets/editor/GitTool/CommitWindow.cs

Commit()执行之前和之后。虽然之后,它确实包含

# Your branch is ahead of 'origin/master' by 1 commit.

更新2

此操作符合预期,在暂存后生成以下输出:

# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   Assets/editor/GitTool/AddWindow.cs

然后我马上致电提交,我得到:

# Your branch is ahead of 'origin/master' by 2 commits.
#
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   Assets/editor/GitTool/AddWindow.cs

所以,提前计数增加了一次,表明存在提交,但文件仍然被报告为新更改,即使据我所知,它不是!

更新3

我刚刚注意到在运行git diff时出现了什么。拾取的差异是文件模式的变化(即100644到100755)或许这是实际发生的事情。我将尝试使用一个可以CLEARLY保持静态的文件(不会打开任何地方,看看系统是否正常运行,但编辑器正在做一些奇怪的文件模式的事情)。

更新4

响应更新3,我意识到我是个白痴。 lib2gitsharp运行正常,但我愚蠢地没有检查是否有任何github(显然)没有在视觉上显示已经改变。在这种情况下,我试图StageCommit的事物的文件模式不断变化(无论出于何种原因,尽管我指责团结)。这导致它看起来没有任何变化,真正的东西正在改变,只是没有文件内容。总而言之,这个问题已经回答了,它让我花了太长时间才意识到这一点。

我还要花一点时间向 nulltoken 致敬,因为尽管 我的无能力才能实现一些小事情,他提供了一些很好的帮助,最终让我在那里。

2 个答案:

答案 0 :(得分:2)

  

您还可以看到一些空白提交的示例,因为我使用该工具尝试提交自己。在这里看看。

实际上,提交不是空的。它包含整个存储库的快照。您可以点击屏幕最右侧的蓝色Browse Code进行检查,这会显示此提交的 content

如果“空提交”是问题,我的猜测是你当前正在暂存未更改的文件(即与父提交相比没有修改的文件)。这导致GitHub界面没有显示“更改”。

您可以通过在Index.RetrieveStatus(f.GetRepresenation());行之前插入Index.Stage(f.GetRepresenation());来轻松查看此内容。

如果我没错,则返回的 FileStatus 应为未经更改

更新

  

此外,我已经验证我正在尝试使用git status暂存然后提交在命令行中标记为已修改的文件。

这很奇怪。我们试试别的。

你可以请:

  • 在调用Console.WriteLine(string.Format("{0} - {1}", f.GetRepresenation(), vcs.GetRepository().Index.RetrieveStatus(f.GetRepresenation())))的行之前添加Index.Stage()
  • 在执行repo.Commit
  • 的调用的行上添加断点
  • 运行代码。当您点击断点时,请针对git status
  • 指向的存储库运行vcs.GetRepository()
  • 使用控制台输出和git status结果更新您的问题。

更新2

感谢您的更新。现在,如果您还在Console.WriteLine调用后添加了另一个Stage调用,会发生什么?这应该在每个文件的Console中产生两个输出行(一个是Modified,第二个是Staged),git status调用应该在{{1}下列出相同的文件}。section。

如果这相应地执行了上述操作,您可以在分段文件的Changes to be committed循环后立即添加repo.Commit()调用吗?此生成包含更改的提交。

更新3

  

因此,提前计数增加一次,表明存在提交

此时,发布foreach 应该列出刚刚提交的更改。有没有?

答案 1 :(得分:2)

问题包含答案,关于成功暂存然后提交文件,你必须简单地

//the path to our repo
string pathToRepo = ".";

//create a new repo
Repository r = new Repository(pathToRepo);

//call stage on all files you wish to stage (stage takes their filenames as strings)
r.Index.Stage("testfile.txt");

//note that below, signatures take a username string, an email string, and a System.DateTimeOffset

//call Commit on the repo, giving a message (string), an author(Signature), and a commit (Signature)
r.Commit("updating testfile.txt",new Signature("username","email",System.DateTimeOffset.Now),new Signature("username","email",System.DateTimeOffset.Now));

//and you've successfully commited to your repo.

我只是一个白痴,并没有意识到事情正在更新。