4

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

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

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

可以在此处完整找到演示此“实际操作”的代码,但基本上是这样运行的:

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()返回 aRepository
您还可以看到一些空白提交的示例,因为我使用该工具尝试自行提交。在这里查看一个。

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

更新

根据 nulltoken 的要求:

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

暂存我的“测试”文件时的结果输出是

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

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

这会产生 git status 的输出,指示

# 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

然后我立即致电 Commit,我得到:

# 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),也许这就是实际发生的情况。我将尝试使用可以清楚地保持静态的文件(不会在任何地方打开并查看系统是否像 git 一样正常运行,但编辑器正在做一些奇怪的文件模式的事情)。

更新 4

响应更新 3,我意识到我是个白痴。lib2gitsharp 运行正常,但我愚蠢地没有检查 github(显然)没有在视觉上显示的任何内容是否发生了变化。在这种情况下,我试图Stage并且Commit不断变化的东西的文件模式(无论出于何种原因,尽管我责怪统一)。这导致它看起来什么都没有改变,当真正的东西在改变时,只是没有文件内容。所以总而言之,这个问题自己回答了,我花了太长时间才意识到它。

我还要花一点时间对nulltoken 表示感谢,因为尽管无法意识到一些小事,但他提供了一些很大的帮助,最终让我到达了那里。

4

2 回答 2

3

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

实际上,提交不是空的。它包含整个存储库的快照。您可以通过单击屏幕最右侧的蓝色来检查这一点Browse Code,这会导致显示此提交的内容

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

Index.RetrieveStatus(f.GetRepresenation());您可以通过在该行之前插入一个调用来轻松检查这一点Index.Stage(f.GetRepresenation());

如果我是正确的,返回的FileStatus应该是Unaltered

更新

此外,我已经验证我正在尝试使用 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?这应该在每个文件的控制台中产生两个输出行(一个是Modified,第二个是Staged),并且git status调用应该在一个Changes to be committed部分下列出相同的文件。

如果按照上述执行,您可以在暂存文件的循环repo.Commit()之后立即添加调用吗?foreach应该产生一个包含更改的提交。

更新 3

所以,提前计数增加了一次,表明有一个提交

此时,发布git diff HEAD~1..HEAD 应该列出刚刚提交的更改。有吗?

于 2013-04-20T18:46:00.813 回答
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.

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

于 2013-04-20T20:49:30.593 回答