{"thread":{"id":"55718","subject":"[GSoC] Hello Git","startedAt":"2021-05-18T06:40:24Z","lastAt":"2021-05-20T15:00:14Z","messageCount":8,"participants":["ZheNing Hu","Christian Couder","Jiang Xin"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"424833","messageId":"CAOLTT8SHE-ok3D+oLNSWFi7KPU==VQnTMDmC4YxUyNBJKmBD8A@mail.gmail.com","threadId":"55718","inReplyTo":null,"subject":"[GSoC] Hello Git","fromName":"ZheNing Hu","fromEmail":"adlternative@gmail.com","sentAt":"2021-05-18T06:40:05Z","receivedAt":"2021-05-18T06:40:24Z","isPatch":false,"sender":{"key":"adlternative@gmail.com","avatar":"https://avatars.githubusercontent.com/u/58138461?v=4"},"body":"Hello，Git!\n\n### Self introduction\n\nI'm ZheNing Hu, I am very lucky to participate in the GSoC\ngit project this year. Many people in the git community already\nhave given me a lot of help in the past few months.\nJunio, Christian, Peff, Eric, Denton..., it's great to get along with\nyou guys! Your review and guidance have greatly benefited\nmy growth.\n\nIn these days before GSoC, I learned some simple command\nimplementation and data structures of git, learned strict coding\nstandards and learned how to test, More importantly, I learned how\nto communicate with these kind-hearted reviewers.\n\nOf course, there are still many difficulties for me:\n* My poor English sometimes can’t express the meaning clearly.\n* The Git architecture is very large, even a small command may\nrequire very complex logic to implement, I often feel very difficult\nto find clues.\n\nTherefore, during GSoC, I hope to overcome these difficulties and\nlearn more in-depth knowledge in git.\n\n### How to complete my GSoC project\n\nI don’t want to be rejected by Git after I have completed a lot of\ncontent, as Olga once did, Therefore, I think it is best to move in\nthe right direction step by step under everyone's supervision.\n\nCurrent condition:\n1. In order to use a unified interface containing both short-named\nand full-named atoms, inspired by the short name option and long name\noption of \"OPT_*\" in `parse-options.h`,  I thought I should add a new short\nname atom to `struct valid_atom` for expansion in `ref-filter.c`, In [1]:\nJunio thinks that `--format` with two-letters short atoms should not be\nimplemented in `ref-filter.c`\nand provided for the `for-each-ref` family. Instead, let the \"log\" family\nlearn the full-named atom. To ensure the consistency of `log --format`\nand `for-each-ref --format`. But for now, It seems that the parsing of\nfull-named atoms in `pretty.c` is not very elegant.\nE.g.\n\n   if (skip_prefix(placeholder, \"(describe\", &arg)) {\n   ...\n   }\n\n       if (skip_prefix(placeholder, \"(trailers\", &arg)) {\n   ...\n   }\n\nWe should have an atom table like `valid_atom` in `ref-filter.c`,\nbut this is missing in `pretty.c`. So how do we complete the\nunification of the two types of atoms now?\n\n2. \"50cfe1f([GSOC] ref-filter: introduce enum atom_type)\" has\nbeen merged into the `next` branch, should we focus on the\nperformance optimization of `ref-filter.c`? Finally, we can build a\n`format_cat_file_item()` similar to `format_ref_array_item()`,\nwhich should not be difficult. And we have to make sure that the\nperformance of `cat-file --batch` is not lower than before.\n\n### The connection between Git and the file system\n\nI am currently studying operating system course, git as a\nfile system on top of the file system.\nThere are many differences and similarities with ordinary\nfile systems. I am very curious about this knowledge, do\nnot know if there are any relevant reading materials?\n\n### Motto\n\nI remember I saw an interview about Junio and Dan Kogai before [2]:\n\nDan: What do you think is a \"good engineer\"?\n\nJunio: When I took over the maintainer of Git, Linus told me that star\nengineers have three qualities. The most important thing is to be able\nto keep doing one thing all the time. In that sense, you can't be an\nalpha geek. It's sharp and you can jump to a new one right away,\nbut don't get bored right away.\n\nIn other words, it’s one thing to have enthusiasm, but it’s more\nimportant to persevere.\n\nWhen I read the Git source code, I can see the code written by Peff\n15 years ago and the code written by Peff a few months ago, which\nis very touching. It's as if you guys can travel through time and space.\n\nSo, I hope I can also persevere and fight for interest. After 15 years,\nlet’s take a look at the code I wrote today :)\n\n[1]:https://lore.kernel.org/git/xmqqk0nz72on.fsf@gitster.g/\n[2]:https://gihyo.jp/dev/serial/01/alpha-geek/0040?page=2\n"},{"id":"424879","messageId":"CAP8UFD0qQg9vfuDvjrc5amnw8w7NFBLEaJUwEksV08HBdFJ7LA@mail.gmail.com","threadId":"55718","inReplyTo":"CAOLTT8SHE-ok3D+oLNSWFi7KPU==VQnTMDmC4YxUyNBJKmBD8A@mail.gmail.com","subject":"Re: [GSoC] Hello Git","fromName":"Christian Couder","fromEmail":"christian.couder@gmail.com","sentAt":"2021-05-18T14:32:18Z","receivedAt":"2021-05-18T14:32:33Z","isPatch":false,"sender":{"key":"christian.couder@gmail.com","avatar":"https://avatars.githubusercontent.com/u/208954?v=4"},"body":"Hi ZheNing,\n\nOn Tue, May 18, 2021 at 8:40 AM ZheNing Hu <adlternative@gmail.com> wrote:\n>\n> Hello，Git!\n>\n> ### Self introduction\n>\n> I'm ZheNing Hu, I am very lucky to participate in the GSoC\n> git project this year. Many people in the git community already\n> have given me a lot of help in the past few months.\n> Junio, Christian, Peff, Eric, Denton..., it's great to get along with\n> you guys! Your review and guidance have greatly benefited\n> my growth.\n\nWe are very happy with your application to the GSoC with us, and with\nyour work so far!\n\n> In these days before GSoC, I learned some simple command\n> implementation and data structures of git, learned strict coding\n> standards and learned how to test, More importantly, I learned how\n> to communicate with these kind-hearted reviewers.\n>\n> Of course, there are still many difficulties for me:\n> * My poor English sometimes can’t express the meaning clearly.\n> * The Git architecture is very large, even a small command may\n> require very complex logic to implement, I often feel very difficult\n> to find clues.\n>\n> Therefore, during GSoC, I hope to overcome these difficulties and\n> learn more in-depth knowledge in git.\n\nSure!\n\n> ### How to complete my GSoC project\n>\n> I don’t want to be rejected by Git after I have completed a lot of\n> content, as Olga once did, Therefore, I think it is best to move in\n> the right direction step by step under everyone's supervision.\n\nSometimes it's very difficult to know in advance what will work well\nenough to be accepted. And if something doesn't work well enough we\ncan still learn from that, and sometimes use it as a base to implement\nsomething better.\n\n> Current condition:\n> 1. In order to use a unified interface containing both short-named\n> and full-named atoms, inspired by the short name option and long name\n> option of \"OPT_*\" in `parse-options.h`,  I thought I should add a new short\n> name atom to `struct valid_atom` for expansion in `ref-filter.c`, In [1]:\n> Junio thinks that `--format` with two-letters short atoms should not be\n> implemented in `ref-filter.c` and provided for the `for-each-ref` family.\n> Instead, let the \"log\" family learn the full-named atom. To ensure the\n> consistency of `log --format` and `for-each-ref --format`.\n\nYeah.\n\n> But for now,\n> It seems that the parsing of full-named atoms in `pretty.c` is not very elegant.\n> E.g.\n>\n>    if (skip_prefix(placeholder, \"(describe\", &arg)) {\n>    ...\n>    }\n>\n>        if (skip_prefix(placeholder, \"(trailers\", &arg)) {\n>    ...\n>    }\n>\n> We should have an atom table like `valid_atom` in `ref-filter.c`,\n> but this is missing in `pretty.c`. So how do we complete the\n> unification of the two types of atoms now?\n\nYeah, unifying pretty.c and ref-filter.c was the purpose of Hariom's\nGSoC last year, and there is still work to do on this, but you might\nwant to focus on the format code used by git cat-file first, as that's\nwhat your project is about.\n\n> 2. \"50cfe1f([GSOC] ref-filter: introduce enum atom_type)\" has\n> been merged into the `next` branch, should we focus on the\n> performance optimization of `ref-filter.c`? Finally, we can build a\n> `format_cat_file_item()` similar to `format_ref_array_item()`,\n> which should not be difficult. And we have to make sure that the\n> performance of `cat-file --batch` is not lower than before.\n\nI wonder if format_ref_array_item() could not just be used by\nbatch_object_write() like Olga did it in:\n\nhttps://github.com/git/git/pull/568/commits/f911b342ae6503dc9f6f8e3c7df316aa45d97bdf\n\n> ### The connection between Git and the file system\n>\n> I am currently studying operating system course, git as a\n> file system on top of the file system.\n> There are many differences and similarities with ordinary\n> file systems. I am very curious about this knowledge, do\n> not know if there are any relevant reading materials?\n\nYou might be interested in https://ostreedev.github.io/ostree/\n\nBest,\nChristian.\n"},{"id":"424920","messageId":"CANYiYbGV1LO33piD+oMxjF83K6Nt=19Lk_8oBgzNCVcB=AokfA@mail.gmail.com","threadId":"55718","inReplyTo":"CAOLTT8SHE-ok3D+oLNSWFi7KPU==VQnTMDmC4YxUyNBJKmBD8A@mail.gmail.com","subject":"Re: [GSoC] Hello Git","fromName":"Jiang Xin","fromEmail":"worldhello.net@gmail.com","sentAt":"2021-05-19T07:19:15Z","receivedAt":"2021-05-19T07:19:29Z","isPatch":false,"sender":{"key":"worldhello.net@gmail.com","avatar":"https://avatars.githubusercontent.com/u/183860?v=4"},"body":"ZheNing Hu <adlternative@gmail.com> 于2021年5月18日周二 下午2:40写道：\n>\n> Hello，Git!\n>\n> ### Self introduction\n>\n> I'm ZheNing Hu, I am very lucky to participate in the GSoC\n> git project this year. Many people in the git community already\n> have given me a lot of help in the past few months.\n> Junio, Christian, Peff, Eric, Denton..., it's great to get along with\n> you guys! Your review and guidance have greatly benefited\n> my growth.\n\nI admire you so much that you can join the open source community at a\nvery young age. I will continue to offer my help both online and\noffline, in your favorite language (Chinese of course).\n\n> In these days before GSoC, I learned some simple command\n> implementation and data structures of git, learned strict coding\n> standards and learned how to test, More importantly, I learned how\n> to communicate with these kind-hearted reviewers.\n>\n> Of course, there are still many difficulties for me:\n> * My poor English sometimes can’t express the meaning clearly.\n\nThere are too many differences between English and Chinese, but don't\nworry. Remember, practice is perfect. You can also practice your\nEnglish by reviewing Git l10n in Chinese, see: \"po/README.md\".\n\n> ### The connection between Git and the file system\n>\n> I am currently studying operating system course, git as a\n> file system on top of the file system.\n> There are many differences and similarities with ordinary\n> file systems. I am very curious about this knowledge, do\n> not know if there are any relevant reading materials?\n\nGit objects are stored in \".git/objects\" directory in two forms: loose\nobject and packfile.  These two types of files are deflated in zlib\nformat. In order to increase the speed of traversing these objects in\nthis object store, many meta files are created. For example, index\nfiles and reverse index files for packfiles, bitmap file, commit-graph\nfiles, etc.\n\nDocs for these files:\n\n * Documentation/technical/pack-format.txt\n * Documentation/technical/index-format.txt\n * Documentation/technical/chunk-format.txt\n * Documentation/technical/multi-pack-index.txt\n * Documentation/technical/bitmap-format.txt\n * Documentation/technical/commit-graph-format.txt\n * Documentation/technical/commit-graph.txt\n\n--\nJiang Xin\n"},{"id":"425055","messageId":"CAOLTT8TRqn5=SqEEnHdFaYi1U5XJXM_MrULfPVzAGPH9AjXk-w@mail.gmail.com","threadId":"55718","inReplyTo":"CAP8UFD0qQg9vfuDvjrc5amnw8w7NFBLEaJUwEksV08HBdFJ7LA@mail.gmail.com","subject":"Re: [GSoC] Hello Git","fromName":"ZheNing Hu","fromEmail":"adlternative@gmail.com","sentAt":"2021-05-20T07:14:06Z","receivedAt":"2021-05-20T07:14:24Z","isPatch":false,"sender":{"key":"adlternative@gmail.com","avatar":"https://avatars.githubusercontent.com/u/58138461?v=4"},"body":"Christian Couder <christian.couder@gmail.com> 于2021年5月18日周二 下午10:32写道：\n>\n> Hi ZheNing,\n>\n> On Tue, May 18, 2021 at 8:40 AM ZheNing Hu <adlternative@gmail.com> wrote:\n> >\n> > Hello，Git!\n> >\n> > ### Self introduction\n> >\n> > I'm ZheNing Hu, I am very lucky to participate in the GSoC\n> > git project this year. Many people in the git community already\n> > have given me a lot of help in the past few months.\n> > Junio, Christian, Peff, Eric, Denton..., it's great to get along with\n> > you guys! Your review and guidance have greatly benefited\n> > my growth.\n>\n> We are very happy with your application to the GSoC with us, and with\n> your work so far!\n>\n\nThanks!\n\n> > But for now,\n> > It seems that the parsing of full-named atoms in `pretty.c` is not very elegant.\n> > E.g.\n> >\n> >    if (skip_prefix(placeholder, \"(describe\", &arg)) {\n> >    ...\n> >    }\n> >\n> >        if (skip_prefix(placeholder, \"(trailers\", &arg)) {\n> >    ...\n> >    }\n> >\n> > We should have an atom table like `valid_atom` in `ref-filter.c`,\n> > but this is missing in `pretty.c`. So how do we complete the\n> > unification of the two types of atoms now?\n>\n> Yeah, unifying pretty.c and ref-filter.c was the purpose of Hariom's\n> GSoC last year, and there is still work to do on this, but you might\n> want to focus on the format code used by git cat-file first, as that's\n> what your project is about.\n>\n\nOh, what you said makes sense. The refactoring of `cat-file --batch`\nusing `ref-filter` logic seems to have little to do with the task of letting\n`ref-filter` learn short-name atoms at the time. I will shift the focus of\nmy work\n\n> > 2. \"50cfe1f([GSOC] ref-filter: introduce enum atom_type)\" has\n> > been merged into the `next` branch, should we focus on the\n> > performance optimization of `ref-filter.c`? Finally, we can build a\n> > `format_cat_file_item()` similar to `format_ref_array_item()`,\n> > which should not be difficult. And we have to make sure that the\n> > performance of `cat-file --batch` is not lower than before.\n>\n> I wonder if format_ref_array_item() could not just be used by\n> batch_object_write() like Olga did it in:\n>\n> https://github.com/git/git/pull/568/commits/f911b342ae6503dc9f6f8e3c7df316aa45d97bdf\n>\n\nThanks for the tip! Olga uses `format_cat_file_item()` in\nbatch_object_write() , which may be the correct approach.\nBefore that, we have to make ref-filter support \"%(contents:raw)\"\n(similar to Olga's \"%(raw)\") and \"%(rest)\".\n\n> > ### The connection between Git and the file system\n> >\n> > I am currently studying operating system course, git as a\n> > file system on top of the file system.\n> > There are many differences and similarities with ordinary\n> > file systems. I am very curious about this knowledge, do\n> > not know if there are any relevant reading materials?\n>\n> You might be interested in https://ostreedev.github.io/ostree/\n>\n> Best,\n> Christian.\n\nThanks!\n--\nZheNing Hu\n"},{"id":"425056","messageId":"CAOLTT8Qa7+8oA2C9HC-9a9i=xVD+4eL-RCEt7K9EG5Fv8OTFaw@mail.gmail.com","threadId":"55718","inReplyTo":"CANYiYbGV1LO33piD+oMxjF83K6Nt=19Lk_8oBgzNCVcB=AokfA@mail.gmail.com","subject":"Re: [GSoC] Hello Git","fromName":"ZheNing Hu","fromEmail":"adlternative@gmail.com","sentAt":"2021-05-20T07:21:43Z","receivedAt":"2021-05-20T07:21:58Z","isPatch":false,"sender":{"key":"adlternative@gmail.com","avatar":"https://avatars.githubusercontent.com/u/58138461?v=4"},"body":"Jiang Xin <worldhello.net@gmail.com> 于2021年5月19日周三 下午3:19写道：\n>\n> > I'm ZheNing Hu, I am very lucky to participate in the GSoC\n> > git project this year. Many people in the git community already\n> > have given me a lot of help in the past few months.\n> > Junio, Christian, Peff, Eric, Denton..., it's great to get along with\n> > you guys! Your review and guidance have greatly benefited\n> > my growth.\n>\n> I admire you so much that you can join the open source community at a\n> very young age. I will continue to offer my help both online and\n> offline, in your favorite language (Chinese of course).\n>\n\nParticipating in open source is a very fun thing! Thanks for your help haha!\n\n> > In these days before GSoC, I learned some simple command\n> > implementation and data structures of git, learned strict coding\n> > standards and learned how to test, More importantly, I learned how\n> > to communicate with these kind-hearted reviewers.\n> >\n> > Of course, there are still many difficulties for me:\n> > * My poor English sometimes can’t express the meaning clearly.\n>\n> There are too many differences between English and Chinese, but don't\n> worry. Remember, practice is perfect. You can also practice your\n> English by reviewing Git l10n in Chinese, see: \"po/README.md\".\n>\n\nI have noticed that the language translation comparison table is in *.po,\nwhich really helps me a lot sometimes.\n\n> > ### The connection between Git and the file system\n> >\n> > I am currently studying operating system course, git as a\n> > file system on top of the file system.\n> > There are many differences and similarities with ordinary\n> > file systems. I am very curious about this knowledge, do\n> > not know if there are any relevant reading materials?\n>\n> Git objects are stored in \".git/objects\" directory in two forms: loose\n> object and packfile.  These two types of files are deflated in zlib\n> format. In order to increase the speed of traversing these objects in\n> this object store, many meta files are created. For example, index\n> files and reverse index files for packfiles, bitmap file, commit-graph\n> files, etc.\n>\n> Docs for these files:\n>\n>  * Documentation/technical/pack-format.txt\n>  * Documentation/technical/index-format.txt\n>  * Documentation/technical/chunk-format.txt\n>  * Documentation/technical/multi-pack-index.txt\n>  * Documentation/technical/bitmap-format.txt\n>  * Documentation/technical/commit-graph-format.txt\n>  * Documentation/technical/commit-graph.txt\n>\n\nThis is what I want to know: how git objects are stored!\nThis can help me understand git itself at a deeper level.\n\n> --\n> Jiang Xin\n\nThanks!\n--\nZheNing Hu\n"},{"id":"425058","messageId":"CAP8UFD2_PWKzwuYACH2MkjzCqO4VWm1EwReOZjgnsXAgpFcZtA@mail.gmail.com","threadId":"55718","inReplyTo":"CAOLTT8TRqn5=SqEEnHdFaYi1U5XJXM_MrULfPVzAGPH9AjXk-w@mail.gmail.com","subject":"Re: [GSoC] Hello Git","fromName":"Christian Couder","fromEmail":"christian.couder@gmail.com","sentAt":"2021-05-20T08:00:15Z","receivedAt":"2021-05-20T08:00:31Z","isPatch":false,"sender":{"key":"christian.couder@gmail.com","avatar":"https://avatars.githubusercontent.com/u/208954?v=4"},"body":"On Thu, May 20, 2021 at 9:14 AM ZheNing Hu <adlternative@gmail.com> wrote:\n>\n> Christian Couder <christian.couder@gmail.com> 于2021年5月18日周二 下午10:32写道：\n\n> > > 2. \"50cfe1f([GSOC] ref-filter: introduce enum atom_type)\" has\n> > > been merged into the `next` branch, should we focus on the\n> > > performance optimization of `ref-filter.c`? Finally, we can build a\n> > > `format_cat_file_item()` similar to `format_ref_array_item()`,\n> > > which should not be difficult. And we have to make sure that the\n> > > performance of `cat-file --batch` is not lower than before.\n> >\n> > I wonder if format_ref_array_item() could not just be used by\n> > batch_object_write() like Olga did it in:\n> >\n> > https://github.com/git/git/pull/568/commits/f911b342ae6503dc9f6f8e3c7df316aa45d97bdf\n>\n> Thanks for the tip! Olga uses `format_cat_file_item()` in\n\nYou mean `format_ref_array_item()` not `format_cat_file_item()`, right?\n\n> batch_object_write() , which may be the correct approach.\n> Before that, we have to make ref-filter support \"%(contents:raw)\"\n> (similar to Olga's \"%(raw)\") and \"%(rest)\".\n\nYeah, please take a look, if you haven't already, at\nhttps://github.com/git/git/pull/568 where Olga already worked on that.\nIt would likely help if you can reuse her work.\n"},{"id":"425059","messageId":"CAOLTT8QO6RsScmvxrvNo5SisWtm9BhfPiK3T8Ez-exwMwOUT_Q@mail.gmail.com","threadId":"55718","inReplyTo":"CAP8UFD2_PWKzwuYACH2MkjzCqO4VWm1EwReOZjgnsXAgpFcZtA@mail.gmail.com","subject":"Re: [GSoC] Hello Git","fromName":"ZheNing Hu","fromEmail":"adlternative@gmail.com","sentAt":"2021-05-20T08:09:43Z","receivedAt":"2021-05-20T08:10:01Z","isPatch":false,"sender":{"key":"adlternative@gmail.com","avatar":"https://avatars.githubusercontent.com/u/58138461?v=4"},"body":"Christian Couder <christian.couder@gmail.com> 于2021年5月20日周四 下午4:00写道：\n>\n> On Thu, May 20, 2021 at 9:14 AM ZheNing Hu <adlternative@gmail.com> wrote:\n> >\n> > Christian Couder <christian.couder@gmail.com> 于2021年5月18日周二 下午10:32写道：\n>\n> > > > 2. \"50cfe1f([GSOC] ref-filter: introduce enum atom_type)\" has\n> > > > been merged into the `next` branch, should we focus on the\n> > > > performance optimization of `ref-filter.c`? Finally, we can build a\n> > > > `format_cat_file_item()` similar to `format_ref_array_item()`,\n> > > > which should not be difficult. And we have to make sure that the\n> > > > performance of `cat-file --batch` is not lower than before.\n> > >\n> > > I wonder if format_ref_array_item() could not just be used by\n> > > batch_object_write() like Olga did it in:\n> > >\n> > > https://github.com/git/git/pull/568/commits/f911b342ae6503dc9f6f8e3c7df316aa45d97bdf\n> >\n> > Thanks for the tip! Olga uses `format_cat_file_item()` in\n>\n> You mean `format_ref_array_item()` not `format_cat_file_item()`, right?\n>\n\nYes. `format_ref_array_item()`.\n\n> > batch_object_write() , which may be the correct approach.\n> > Before that, we have to make ref-filter support \"%(contents:raw)\"\n> > (similar to Olga's \"%(raw)\") and \"%(rest)\".\n>\n> Yeah, please take a look, if you haven't already, at\n> https://github.com/git/git/pull/568 where Olga already worked on that.\n> It would likely help if you can reuse her work.\n\nI have check them, I want to use \"%(contents:raw)\" instead of %(raw),\nhttps://github.com/gitgitgadget/git/pull/958 tell the reason,\nI will submit it later.\n\n--\nZheNing Hu\n"},{"id":"425107","messageId":"CAP8UFD2FuGDqiDUpZohvn9WnBqGwTfak6AfB4pGuh7ATY6o4rA@mail.gmail.com","threadId":"55718","inReplyTo":"CAOLTT8QO6RsScmvxrvNo5SisWtm9BhfPiK3T8Ez-exwMwOUT_Q@mail.gmail.com","subject":"Re: [GSoC] Hello Git","fromName":"Christian Couder","fromEmail":"christian.couder@gmail.com","sentAt":"2021-05-20T14:59:59Z","receivedAt":"2021-05-20T15:00:14Z","isPatch":false,"sender":{"key":"christian.couder@gmail.com","avatar":"https://avatars.githubusercontent.com/u/208954?v=4"},"body":"On Thu, May 20, 2021 at 10:09 AM ZheNing Hu <adlternative@gmail.com> wrote:\n\n> Christian Couder <christian.couder@gmail.com> 于2021年5月20日周四 下午4:00写道：\n> > > Before that, we have to make ref-filter support \"%(contents:raw)\"\n> > > (similar to Olga's \"%(raw)\") and \"%(rest)\".\n> >\n> > Yeah, please take a look, if you haven't already, at\n> > https://github.com/git/git/pull/568 where Olga already worked on that.\n> > It would likely help if you can reuse her work.\n>\n> I have check them, I want to use \"%(contents:raw)\" instead of %(raw),\n> https://github.com/gitgitgadget/git/pull/958 tell the reason,\n> I will submit it later.\n\nGreat, thanks!\n"}]}