Я запускаю простой сборщик идентификаторов объектов на большом git repo (в данном случае linux-2.6), готовясь к хранению идентификаторов в базе данных sqlite.Почему я вижу дубликаты идентификаторов объектов при использовании git_odb_foreach?
Псевдо-код:
// Table holding the SHA1 of each object in the database, ensure ids are unique
CREATE TABLE objs(key INTEGER PRIMARY KEY, id BLOB UNIQUE);
// For each id, insert into objs table, rc can tell us if we violate uniqueness constraint
int callback(const git_oid *oid, void *payload) {
// note that 'oid' in the following string is really the id value in real code
int rc = sqlite3_exec("INSERT INTO objs(id) VALUES(oid);");
if (rc == SQLITE_CONSTRAINT) {
// code to print type and oid
}
}
int main() {
// sqlite and git initialization
git_odb_foreach(...callback...);
// cleanup
return 0;
}
Out из ~ 4 миллионов объектов, есть ~ 70000 неуникальных объектов я в конечном итоге встретив по пути. Интересно, что при запуске 'git rev-list -objects -all | wc -l ', этот счетчик соответствует количеству уникальных объектов из кода foreach.
Может кто-нибудь объяснить, почему функция git_odb_foreach создаст эти уникальные идентификаторы?