正确的分级文件和提交方式
本文关键字:提交 方式 文件 | 更新日期: 2023-09-27 18:10:13
当我尝试执行以下操作时,我只是最终生成空提交;也就是说,它创建了一个没有任何更改的提交。
string filename = "path/to/file";
repo.Index.Stage(filename);
repo.Commit();
请注意,路径是相对的,意思是,我使用Repository repo = new Repository(".");
创建我的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()
返回Repository
您还可以看到一些空白提交的示例,因为我使用该工具进行了尝试承诺:承诺自己点击这里查看。
此外,我已经验证了我正在使用git status
尝试暂存并提交在命令行中标记为已修改的文件。因此,我不只是试图提交未修改的文件,也不提交已经提交的文件。我(据我所知)试图为需要更新的文件做这个.Stage() .Commit()
过程。
根据nulltoken的请求:
添加Console.WriteLine(字符串。Format("{0} - {1}", f.g etrepresentation (), vcs.GetRepository(). index . retrievestatus (f.g etrepresentation())))在调用Index.Stage()的行之前).
存放我的"测试"文件时的结果输出是
Assets'editor'GitTool'AddWindow.cs - Modified
Assets'editor'GitTool'CommitWindow.cs - Modified
在执行repo调用的行上添加一个断点。提交运行代码。当遇到断点时,请对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
它的行为与预期一致,在staging后产生以下输出:
# 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
因此,ahead by count增加了一次,表明有一个提交,但文件仍然被报告为新更改,即使据我所知它不是!
更新3
我刚刚注意到一些运行git diff
。文件模式的改变(即100644到100755)可能这就是实际发生的事情。我将尝试所有可以保持静态的文件(不会在任何地方打开,看看系统是否像git一样正常运行,但编辑器正在做一些奇怪的文件模式的事情)。
回应更新3,我意识到我是一个白痴。Lib2gitsharp功能正常,但我愚蠢地没有检查github(显然)没有在视觉上显示的东西是否发生了变化。在这种情况下,我尝试Stage
和Commit
的文件模式不断变化(无论出于何种原因,尽管我指责unity)。这导致看起来没有任何变化,而实际上东西在变化,只是没有文件内容。总而言之,这个问题自己回答了,只是我花了太长时间才意识到。
我还将花一分钟的时间向nulltoken致敬,因为尽管我的无法实现小事情,但他提供了一些很大的帮助,使我最终到达了那里。
您还可以看到一些空白提交的示例,因为我使用该工具尝试提交自己。点击这里查看。
实际上,提交不是空的。它包含整个存储库的快照。您可以通过单击屏幕最右边的蓝色Browse Code
来检查这一点,这会显示此提交的内容。
如果"空承诺";问题是,我的猜测是,您目前暂存未更改的文件(即。没有修改的文件(与父提交相比)。这导致GitHub界面显示没有"更改"。
您可以通过在Index.Stage(f.GetRepresenation());
行之前插入对Index.RetrieveStatus(f.GetRepresenation());
的调用来轻松检查这一点。
如果我是正确的,返回的FileStatus应该是Unaltered。
更新此外,我已经验证了我正在尝试阶段,然后提交在命令行中标记为已修改的文件,使用git status。
那很奇怪。我们试试别的办法吧。
请:
- 在
Index.Stage()
之前添加Console.WriteLine(string.Format("{0} - {1}", f.GetRepresenation(), vcs.GetRepository().Index.RetrieveStatus(f.GetRepresenation())))
。 - 在执行
repo.Commit
调用的行上添加一个断点 - 运行代码。当您遇到断点时,请针对
vcs.GetRepository()
指向的存储库运行 - 用控制台输出和
git status
结果更新问题。
git status
。更新2
谢谢你的更新。现在,如果在Stage
调用之后还添加另一个Console.WriteLine
调用,会发生什么?这应该在控制台中为每个文件生成两个输出行(一个是Modified
,另一个是Staged
), git status
调用应该在Changes to be committed
节下列出相同的文件。
如果这与上面的执行一致,您是否可以在foreach
循环之后立即添加repo.Commit()
调用,以分级文件?这个应该产生一个包含更改的Commit。
3
更新在这一点上,发布所以,ahead by计数增加一次,表示有一个提交
git diff HEAD~1..HEAD
应该列出刚刚提交的更改。有吗?
问题中包含了答案,为了成功地启动并提交文件,您必须简单地
//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.
我简直就是个白痴,没有意识到东西正在更新