4

次のことをしようとすると、空のコミットが生成されてしまいます。つまり、何も変更されていないコミットを作成します。

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

パスは相対的であることに注意してください。つまり、Repository使用して作成し、Repository 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()です。ここでRepository
1つチェックしてください。

さらに、コマンド ラインで変更済みとしてマークされたファイルをステージングしてコミットしようとしていることを確認しました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 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

そのため、事前カウントが 1 回増加し、コミットがあったことを示しますが、私の知る限りではそうではありませんが、ファイルはまだ新しく変更されたと報告されています!

更新 3

実行中に何かに気づきましたgit diff。ファイル モードの変更 (つまり、100644 から 100755 へ) が検出されています。おそらくこれが実際に起こっていることです。明らかに静的なままであることができるファイルですべてを試します(どこにも開かず、システムがgitのように適切に機能しているかどうかを確認しますが、エディターは奇妙なファイルモードのことを行っています)。

更新 4

アップデート 3 に対応して、私は自分が馬鹿であることに気付きました。lib2gitsharp は正常に機能していますが、github (明らかに) が視覚的に表示されていないものが変更されたかどうかを確認するために愚かなことをしていませんでした。この場合、私が試みていたもののファイルモードは絶えず変化しStageCommitいました(何らかの理由で、私は団結を非難していますが)。これにより、ファイルのコンテンツだけでなく、実際に何かが変更されているときに、何も変更されていないように見えました。全体として、この質問はそれ自体で答えられましたが、それを理解するのに時間がかかりすぎました.

また、nulltoken に感謝の言葉を述べます。私はささいことに気づかなかったにもかかわらず、彼は大きな助けを提供してくれたので、最終的にそこにたどり着きました。

4

2 に答える 2

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 に答える