それは非常に奇妙です。問題を再現できません。
どのバージョンの libgit2 に対して実行していますか?
問題を再現するテストを libgit2 fetch スイートにローカルに追加しました... libgit2 の現在の最新の開発ヒントに合格します。次の URL が正常にチェックされました:
static void transferProgressCallback(const git_transfer_progress *stats, void *payload)
{
bool *invoked = (bool *)payload;
*invoked = true;
}
void test_network_fetch__doesnt_retreive_a_pack_when_the_repository_is_up_to_date(void)
{
git_repository *_repository;
git_remote *remote;
bool invoked = false;
cl_git_pass(git_clone_bare(&_repository, "https://github.com/libgit2/TestGitRepository.git", "./fetch/lg2", NULL, NULL));
git_repository_free(_repository);
cl_git_pass(git_repository_open(&_repository, "./fetch/lg2"));
cl_git_pass(git_remote_load(&remote, _repository, "origin"));
cl_git_pass(git_remote_connect(remote, GIT_DIR_FETCH));
cl_assert_equal_i(false, invoked);
cl_git_pass(git_remote_download(remote, &transferProgressCallback, &invoked));
cl_assert_equal_i(false, invoked);
cl_git_pass(git_remote_update_tips(remote));
git_remote_disconnect(remote);
git_remote_free(remote);
git_repository_free(_repository);
}
アップデート:
テストがCIサーバーであるTravisにも合格することを確認するために、libgit2プロジェクトにプルリクエストを送信しました。
更新 2:
わかりました、さらにトラブルシューティングを行いましたが、まだ問題を再現できません。
- Web インターフェイスを使用して、GitHub に新しいリポジトリを作成しました
- bash セッションでコミットを作成し、アップストリームにプッシュしました
- 次に、新しい一時フォルダーに libgit2 を介してクローンを作成しました。3 つのオブジェクトがダウンロードされました
- その後、もう一度フェッチしましたが、何もダウンロードされませんでした。
- bash セッションに戻り、別のコミットを作成してアップストリームにプッシュしました
- libgit2 コードに戻ると、再度フェッチすると、2 番目のコミットから 3 つの新しいオブジェクトがダウンロードされます。
以下のコードは、実際のテストではありませんが (ユーザーの操作が必要なため)、上記の説明を示しています。
void test_network_fetch__retrieve_a_pack_when_the_remote_repository_has_been_updated(void)
{
git_repository *_repository;
git_remote *remote;
bool invoked = false;
/*
* $ mkdir /tmp/so-check/ && cd /tmp/so-check/
*
* $ touch README.md
*
* $ git init
* Initialized empty Git repository in d:/temp/so-check/.git/
*
* $ git add README.md
*
* $ git commit -m "first commit"
* [master (root-commit) e3454be] first commit
* 0 files changed
* create mode 100644 README.md
*
* $ git remote add origin https://github.com/nulltoken/so-check.git
*
* $ git push -u origin master
* Username for 'https://github.com': nulltoken
* Password for 'https://nulltoken@github.com':
* Counting objects: 3, done.
* Writing objects: 100% (3/3), 212 bytes, done.
* Total 3 (delta 0), reused 0 (delta 0)
* To https://github.com/nulltoken/so-check.git
* * [new branch] master -> master
* Branch master set up to track remote branch master from origin.
*
* $
*/
cl_git_pass(git_clone_bare(&_repository, "https://github.com/nulltoken/so-check.git", "./fetch/soc", NULL, NULL));
git_repository_free(_repository);
cl_git_pass(git_repository_open(&_repository, "./fetch/soc"));
cl_git_pass(git_remote_load(&remote, _repository, "origin"));
cl_git_pass(git_remote_connect(remote, GIT_DIR_FETCH));
cl_assert_equal_i(false, invoked);
cl_git_pass(git_remote_download(remote, &transferProgressCallback, &invoked));
cl_assert_equal_i(false, invoked);
cl_git_pass(git_remote_update_tips(remote));
git_remote_disconnect(remote);
git_remote_free(remote);
git_repository_free(_repository);
/*
* $ mkdir /tmp/so-check2 && cd /tmp/so-check2
*
* $ git clone https://github.com/nulltoken/so-check.git .
* Cloning into '.'...
* remote: Counting objects: 3, done.
* remote: Total 3 (delta 0), reused 3 (delta 0)
* Unpacking objects: 100% (3/3), done.
*
* $ echo "Test" > README.md
*
* $ git add README.md
*
* $ git commit -m "Now with a meaningful content"
* [master 9c6c300] Now with a meaningful content
* 1 file changed, 1 insertion(+)
*
$ git push
* Username for 'https://github.com': nulltoken
* Password for 'https://nulltoken@github.com':
* Counting objects: 5, done.
* Writing objects: 100% (3/3), 262 bytes, done.
* Total 3 (delta 0), reused 0 (delta 0)
* To https://github.com/nulltoken/so-check.git
* e3454be..9794f71 master -> master
* $
*/
/* Set a breakpoint below in order to push the additional commit.
* Once it's done, let the code run again.
*/
cl_git_pass(git_repository_open(&_repository, "./fetch/soc"));
cl_git_pass(git_remote_load(&remote, _repository, "origin"));
cl_git_pass(git_remote_connect(remote, GIT_DIR_FETCH));
cl_assert_equal_i(false, invoked);
cl_git_pass(git_remote_download(remote, &transferProgressCallback, &invoked));
cl_assert_equal_i(true, invoked);
cl_git_pass(git_remote_update_tips(remote));
git_remote_disconnect(remote);
git_remote_free(remote);
git_repository_free(_repository);
}
コンソールの出力の下に、2 番目のダウンロードの結果が表示されます。3 つのオブジェクトのみが取得されていることに注意してください。
Fetching: (0/3)
Fetching: (1/3)
Fetching: (2/3)
Fetching: (3/3)
Fetching: (3/3)
また、リポジトリには 6 つのオブジェクト (最初のコミットから 3 つ、2 番目のコミットから 3 つ) が保持されます。
$ git count-objects --verbose
count: 6
size: 0
in-pack: 0
packs: 0
size-pack: 0
prune-packable: 0
garbage: 0
私の観点からは、libgit2 は実際に差分パックをダウンロードできるように見えます。