[{"data":1,"prerenderedAt":781},["ShallowReactive",2],{"NoscriptNav_XrRK2e2e8meJ0jKVGkb5ULGQDVi3UiFQ9nupAr7Yns":3,"\u002Fideas\u002Fgit-diff-drivers":8},["Island",4],{"key":5,"result":6},"NoscriptNav_XrRK2e2e8meJ0jKVGkb5ULGQDVi3UiFQ9nupAr7Yns",{"head":7},{},{"id":9,"title":10,"authors":11,"body":13,"canonicalUrl":768,"canonicalWebsiteName":769,"category":770,"date":771,"description":772,"extension":773,"featured":774,"fullWidthLayout":774,"image":775,"imageAlt":775,"location":775,"meta":776,"metaImage":775,"navigation":469,"path":777,"seo":778,"stem":779,"venue":775,"venueUrl":775,"__hash__":780},"ideas\u002Fideas\u002Fgit-diff-drivers.md","Git Diff Drivers",[12],"andrew",{"type":14,"value":15,"toc":760},"minimark",[16,33,38,71,87,97,124,128,135,146,173,179,201,204,214,225,238,242,247,259,264,285,290,307,312,325,330,353,358,376,381,391,396,406,411,427,438,534,551,555,648,652,680,684,702,714,733,739,747,756],[17,18,19,20,27,28,32],"p",{},"When I added a diff driver to ",[21,22,26],"a",{"href":23,"rel":24},"https:\u002F\u002Fgithub.com\u002Fgit-pkgs\u002Fgit-pkgs",[25],"nofollow","git-pkgs",", most of the work was already done. git-pkgs could parse 29 lockfile formats and extract dependency lists, so wiring that into git's textconv mechanism was a small addition that turned ",[29,30,31],"code",{},"git diff"," on a lockfile from 200 lines of resolver noise into a handful of dependency changes. That got me looking at what else people had built on top of git's diff driver system, and at the 28 built-in drivers that git ships, none of which has made it into any forge or GUI client.",[34,35,37],"h3",{"id":36},"built-in-drivers","Built-in drivers",[17,39,40,41,46,47,50,51,54,55,58,59,62,63,66,67,70],{},"The ",[21,42,45],{"href":43,"rel":44},"https:\u002F\u002Fgithub.com\u002Fgit\u002Fgit\u002Fblob\u002Fmaster\u002Fuserdiff.c",[25],"built-in drivers"," are defined in ",[29,48,49],{},"userdiff.c"," and activated by setting ",[29,52,53],{},"diff=\u003Cname>"," in ",[29,56,57],{},".gitattributes",". Each one provides two things: a ",[29,60,61],{},"xfuncname"," regex that git uses to find function or section headers for hunk context, and a ",[29,64,65],{},"wordRegex"," that controls how ",[29,68,69],{},"--word-diff"," tokenizes lines.",[17,72,73,74,79,80,83,84,86],{},"The full list as of git 2.53: ada, bash, bibtex, cpp (which covers both C and C++), csharp, css, default, dts, elixir, fortran, fountain, golang, html, ini, java, kotlin, markdown, matlab, objc, pascal, perl, php, python, r, ruby, rust, scheme, and tex. The two most recent additions are ini (2.50) and r (2.51). GitHub's ",[21,75,78],{"href":76,"rel":77},"https:\u002F\u002Fgithub.com\u002Fgithub-linguist\u002Flinguist",[25],"linguist"," uses these same names for language detection, so if you set ",[29,81,82],{},"*.rs diff=rust"," in your ",[29,85,57],{},", both git locally and GitHub's code view will understand the intent, though GitHub doesn't actually use the driver for its web diffs.",[88,89,94],"pre",{"className":90,"code":92,"language":93},[91],"language-text","*.rs diff=rust\n*.go diff=golang\n*.kt diff=kotlin\n","text",[29,95,92],{"__ignoreMap":96},"",[17,98,99,100,105,106,111,112,115,116,119,120,123],{},"Kotlin was ",[21,101,104],{"href":102,"rel":103},"https:\u002F\u002Fpatchwork.kernel.org\u002Fproject\u002Fgit\u002Fpatch\u002F20220303181517.70682-1-jaydeepjd.8914@gmail.com\u002F",[25],"proposed as a patch"," in 2022 and merged. A ",[21,107,110],{"href":108,"rel":109},"https:\u002F\u002Fgithub.com\u002Fgit\u002Fgit\u002Fpull\u002F1746",[25],"TypeScript driver PR"," was submitted and then retracted, though the cpp driver covers enough of TypeScript's syntax that most people don't notice. Languages without a built-in driver still get the default driver, which tries a few generic heuristics for function headers but often latches onto something unhelpful. The difference shows up in hunk headers. Without a driver, a change inside a Ruby method might show ",[29,113,114],{},"@@ -10,3 +10,4 @@ end"," or latch onto a blank line. With ",[29,117,118],{},"diff=ruby",", the same hunk header becomes ",[29,121,122],{},"@@ -10,3 +10,4 @@ def process_payment",", which tells you where you are without scrolling up.",[34,125,127],{"id":126},"custom-diff-drivers","Custom diff drivers",[17,129,130,131,134],{},"Git supports three kinds of custom diff driver configuration, all set under ",[29,132,133],{},"[diff \"\u003Cname>\"]"," in your git config.",[17,136,137,141,142,145],{},[138,139,140],"strong",{},"textconv"," is the most useful: a command that takes a filename as its argument and writes human-readable text to stdout. Git runs this on both sides of a diff and then diffs the text output instead of the raw file. If you have ",[29,143,144],{},"exiftool"," installed, you can diff image metadata:",[88,147,151],{"className":148,"code":149,"language":150,"meta":96,"style":96},"language-ini shiki shiki-themes github-light github-dark","[diff \"exif\"]\n    textconv = exiftool\n    cachetextconv = true\n","ini",[29,152,153,161,167],{"__ignoreMap":96},[154,155,158],"span",{"class":156,"line":157},"line",1,[154,159,160],{},"[diff \"exif\"]\n",[154,162,164],{"class":156,"line":163},2,[154,165,166],{},"    textconv = exiftool\n",[154,168,170],{"class":156,"line":169},3,[154,171,172],{},"    cachetextconv = true\n",[88,174,177],{"className":175,"code":176,"language":93},[91],"# .gitattributes\n*.png diff=exif\n*.jpg diff=exif\n",[29,178,176],{"__ignoreMap":96},[17,180,181,182,184,185,188,189,192,193,196,197,200],{},"Now ",[29,183,31],{}," on a JPEG shows you which EXIF fields changed rather than a wall of binary gibberish. The ",[29,186,187],{},"cachetextconv"," option stores conversion results in git notes (",[29,190,191],{},"refs\u002Fnotes\u002Ftextconv\u002Fexif",") so repeated diffs don't re-run the conversion every time. Without it, something like ",[29,194,195],{},"git log -p"," on a repository with PDF files will re-run ",[29,198,199],{},"pdftotext"," for every commit that touched one, which gets painful fast.",[17,202,203],{},"The textconv mechanism is one-way: git can display the diff but you can't apply it as a patch, because the original binary content can't be reconstructed from the converted text.",[17,205,206,209,210,213],{},[138,207,208],{},"command"," replaces git's entire diff pipeline for matched files. It receives seven arguments (the same interface as ",[29,211,212],{},"GIT_EXTERNAL_DIFF",") and takes full responsibility for producing output. Most people don't need this unless they want visual side-by-side diffs or output in a non-unified format.",[17,215,216,218,219,221,222,224],{},[138,217,65],{}," redefines what constitutes a \"word\" for ",[29,220,69],{},". The built-in drivers already set language-appropriate word regexes, but for custom file formats you might want to change how tokens are split. A JSON driver might treat entire quoted strings as single tokens so that ",[29,223,69],{}," highlights changed values rather than individual characters within strings.",[17,226,227,228,231,232,234,235,237],{},"A driver with ",[29,229,230],{},"binary = true"," and a ",[29,233,140],{}," command will suppress the \"Binary files differ\" message and show the textconv output instead, and adding ",[29,236,61],{}," gives you meaningful hunk headers even for custom formats.",[34,239,241],{"id":240},"notable-custom-drivers","Notable custom drivers",[17,243,244],{},[138,245,246],{},"Documents",[248,249,250],"ul",{},[251,252,253,258],"li",{},[21,254,257],{"href":255,"rel":256},"https:\u002F\u002Fidogawa.dev\u002Fp\u002F2024\u002F01\u002Fgit-diff-epub.html",[25],"idogawa.dev"," -- writeup on diffing epub, docx, pptx, and sqlite via textconv",[17,260,261],{},[138,262,263],{},"Images",[248,265,266,274],{},[251,267,268,273],{},[21,269,272],{"href":270,"rel":271},"https:\u002F\u002Fgithub.com\u002Fewanmellor\u002Fgit-diff-image",[25],"ewanmellor\u002Fgit-diff-image"," -- uses ImageMagick to generate visual diffs and open them in a viewer",[251,275,276,281,282,284],{},[21,277,280],{"href":278,"rel":279},"https:\u002F\u002Fgist.github.com\u002Fpascaliske\u002F53648334378d592c0c2cc62b989a027e",[25],"pascaliske's gist"," -- uses ",[29,283,144],{}," for metadata-level image diffs",[17,286,287],{},[138,288,289],{},"Apple \u002F Xcode",[248,291,292,299],{},[251,293,294,295,298],{},"Binary plist files have a well-established one-liner: ",[29,296,297],{},"git config diff.plist.textconv \"plutil -convert xml1 -o -\""," converts them to readable XML",[251,300,301,306],{},[21,302,305],{"href":303,"rel":304},"https:\u002F\u002Fgithub.com\u002Fjmah\u002Fxibition",[25],"jmah\u002Fxibition"," -- textconv driver for XIB\u002FNIB files, converts them to a lossy human-readable format showing names, labels, actions, and outlets",[17,308,309],{},[138,310,311],{},"Game engines",[248,313,314,322],{},[251,315,316,321],{},[21,317,320],{"href":318,"rel":319},"https:\u002F\u002Fgithub.com\u002Fmadsbangh\u002Funity2text",[25],"madsbangh\u002Funity2text"," -- textconv driver for Unity YAML scene files (.unity, .prefab), inserts readable GameObject names and hierarchies into the diff output",[251,323,324],{},"Unity also ships UnityYAMLMerge as an official merge driver for three-way merging scene files",[17,326,327],{},[138,328,329],{},"Databases",[248,331,332,345],{},[251,333,334,339,340],{},[21,335,338],{"href":336,"rel":337},"https:\u002F\u002Fgithub.com\u002Fcannadayr\u002Fgit-sqlite",[25],"cannadayr\u002Fgit-sqlite"," -- diffs SQLite databases by dumping schema and data as SQL, following the approach in ",[21,341,344],{"href":342,"rel":343},"https:\u002F\u002Fongardie.net\u002Fblog\u002Fsqlite-in-git\u002F",[25],"Diego Ongaro's post",[251,346,347,352],{},[21,348,351],{"href":349,"rel":350},"https:\u002F\u002Fgithub.com\u002FCpanelInc\u002Fdiff-tools",[25],"CpanelInc\u002Fdiff-tools"," -- cPanel's textconv and merge tools for SQLite, tarballs, and patchfiles",[17,354,355],{},[138,356,357],{},"Spreadsheets",[248,359,360,368],{},[251,361,362,367],{},[21,363,366],{"href":364,"rel":365},"https:\u002F\u002Fgithub.com\u002FDiefBell\u002FXLSX-Diff",[25],"DiefBell\u002FXLSX-Diff"," -- xlsx textconv driver",[251,369,370,375],{},[21,371,374],{"href":372,"rel":373},"https:\u002F\u002Fgithub.com\u002Fpismute\u002Fnode-textconv",[25],"pismute\u002Fnode-textconv"," -- node-based textconv for xlsx",[17,377,378],{},[138,379,380],{},"Notebooks",[248,382,383],{},[251,384,385,390],{},[21,386,389],{"href":387,"rel":388},"https:\u002F\u002Fgithub.com\u002Fjupyter\u002Fnbdime",[25],"nbdime"," -- diff and merge drivers for Jupyter notebooks that strip output cells and render structural changes to the cell list",[17,392,393],{},[138,394,395],{},"Data files",[248,397,398],{},[251,399,400,405],{},[21,401,404],{"href":402,"rel":403},"https:\u002F\u002Fgithub.com\u002Fryan-williams\u002Fparquet-helpers",[25],"ryan-williams\u002Fparquet-helpers"," -- textconv for Parquet files showing metadata, schema, and sample rows",[17,407,408],{},[138,409,410],{},"Lockfiles",[248,412,413,421],{},[251,414,415,420],{},[21,416,419],{"href":417,"rel":418},"https:\u002F\u002Fgithub.com\u002Fnpm\u002Fnpm-merge-driver",[25],"npm\u002Fnpm-merge-driver"," -- merge driver that regenerates the lockfile rather than three-way merging the text",[251,422,423,426],{},[21,424,26],{"href":23,"rel":425},[25]," -- textconv driver I built that parses 29 lockfile formats and outputs only dependency-level changes",[17,428,429,430,433,434,437],{},"A single dependency update in ",[29,431,432],{},"Gemfile.lock"," or ",[29,435,436],{},"package-lock.json"," can produce hundreds of changed lines of internal resolver state, but with a textconv driver you only see what actually changed:",[88,439,443],{"className":440,"code":441,"language":442,"meta":96,"style":96},"language-bash shiki shiki-themes github-light github-dark","$ git pkgs diff-driver --install\n\n$ git diff HEAD~1 -- Gemfile.lock\n+ kamal 2.0.0\n- puma 5.6.8\n+ puma 6.4.2\n+ thruster 0.1.0\n","bash",[29,444,445,465,471,489,501,513,523],{"__ignoreMap":96},[154,446,447,451,455,458,461],{"class":156,"line":157},[154,448,450],{"class":449},"sScJk","$",[154,452,454],{"class":453},"sZZnC"," git",[154,456,457],{"class":453}," pkgs",[154,459,460],{"class":453}," diff-driver",[154,462,464],{"class":463},"sj4cs"," --install\n",[154,466,467],{"class":156,"line":163},[154,468,470],{"emptyLinePlaceholder":469},true,"\n",[154,472,473,475,477,480,483,486],{"class":156,"line":169},[154,474,450],{"class":449},[154,476,454],{"class":453},[154,478,479],{"class":453}," diff",[154,481,482],{"class":453}," HEAD~1",[154,484,485],{"class":463}," --",[154,487,488],{"class":453}," Gemfile.lock\n",[154,490,492,495,498],{"class":156,"line":491},4,[154,493,494],{"class":449},"+",[154,496,497],{"class":453}," kamal",[154,499,500],{"class":463}," 2.0.0\n",[154,502,504,507,510],{"class":156,"line":503},5,[154,505,506],{"class":449},"-",[154,508,509],{"class":453}," puma",[154,511,512],{"class":463}," 5.6.8\n",[154,514,516,518,520],{"class":156,"line":515},6,[154,517,494],{"class":449},[154,519,509],{"class":453},[154,521,522],{"class":463}," 6.4.2\n",[154,524,526,528,531],{"class":156,"line":525},7,[154,527,494],{"class":449},[154,529,530],{"class":453}," thruster",[154,532,533],{"class":463}," 0.1.0\n",[17,535,536,537,539,540,542,543,546,547,550],{},"The install command registers the textconv for each supported lockfile format in your git config and appends the corresponding patterns to ",[29,538,57],{},". Once installed it applies everywhere git shows diffs, including ",[29,541,195],{}," and ",[29,544,545],{},"git show",", and you can bypass it with ",[29,548,549],{},"--no-textconv"," when you need the raw lockfile.",[34,552,554],{"id":553},"gaps","Gaps",[248,556,557,581,592,604,616,626],{},[251,558,559,562,563,568,569,574,575,580],{},[138,560,561],{},"Xcode .pbxproj"," -- UUIDs everywhere, sections reorder on every save, adding one file touches dozens of lines. Merge drivers exist (",[21,564,567],{"href":565,"rel":566},"https:\u002F\u002Fgithub.com\u002FLightricks\u002FKintsugi",[25],"Kintsugi",", ",[21,570,573],{"href":571,"rel":572},"https:\u002F\u002Fgithub.com\u002Fsimonwagner\u002Fmergepbx",[25],"mergepbx",") and ",[21,576,579],{"href":577,"rel":578},"https:\u002F\u002Fgithub.com\u002Fbloomberg\u002Fxcdiff",[25],"xcdiff"," can compare project files standalone, but nobody has wired up a textconv driver.",[251,582,583,586,587,591],{},[138,584,585],{},"Xcode storyboards"," -- XML with machine-generated attributes that reorder on save. XIBs have ",[21,588,590],{"href":303,"rel":589},[25],"xibition"," but storyboards have nothing equivalent.",[251,593,594,597,598,603],{},[138,595,596],{},"Godot .tscn\u002F.tres"," -- already text, so they diff natively, but ",[21,599,602],{"href":600,"rel":601},"https:\u002F\u002Fgithub.com\u002Fgodotengine\u002Fgodot\u002Fissues\u002F5889",[25],"non-deterministic subresource ordering"," and embedded scripts make the diffs noisy. A normalizing textconv could help but nobody has built one.",[251,605,606,609,610,615],{},[138,607,608],{},"Generated OpenAPI \u002F Swagger specs"," -- one endpoint change cascades through the whole document. Standalone semantic diff tools like ",[21,611,614],{"href":612,"rel":613},"https:\u002F\u002Fgithub.com\u002Foasdiff\u002Foasdiff",[25],"oasdiff"," exist but none are wired into git as a textconv.",[251,617,618,621,622,625],{},[138,619,620],{},"Protobuf descriptors (.pb \u002F .desc)"," -- compiled binary that ",[29,623,624],{},"protoc --decode_raw"," can decode, but nobody has published the textconv config for it.",[251,627,628,631,632,637,638,641,642,647],{},[138,629,630],{},"Font files (.ttf\u002F.otf)"," -- ",[21,633,636],{"href":634,"rel":635},"https:\u002F\u002Fgithub.com\u002Ffonttools\u002Ffonttools",[25],"fonttools","' ",[29,639,640],{},"ttx"," command can convert to XML and ",[21,643,646],{"href":644,"rel":645},"https:\u002F\u002Fgithub.com\u002Fsource-foundry\u002Ffdiff",[25],"fdiff"," can diff fonts standalone, but neither is packaged as a git driver.",[34,649,651],{"id":650},"configuration-gotcha","Configuration gotcha",[17,653,654,655,657,658,661,662,433,665,668,669,671,672,675,676,679],{},"The split between ",[29,656,57],{}," (which can be committed) and ",[29,659,660],{},"[diff]"," config (which lives in ",[29,663,664],{},".git\u002Fconfig",[29,666,667],{},"~\u002F.gitconfig",") means that diff drivers are inherently local. You can commit a ",[29,670,57],{}," that says ",[29,673,674],{},"*.db diff=sqlite",", but every developer on the team still needs to configure the ",[29,677,678],{},"[diff \"sqlite\"]"," section themselves and have the converter tool installed. Some projects include a setup script or document the required config in their README, but there's no mechanism for a repository to declaratively ship its own diff driver configuration that git will auto-apply on clone, which is also why forge integration has been so slow.",[34,681,683],{"id":682},"forge-support","Forge support",[17,685,686,687,692,693,698,699,701],{},"GitHub has built bespoke rich diff renderers for ",[21,688,691],{"href":689,"rel":690},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Frepositories\u002Fworking-with-files\u002Fusing-files\u002Fworking-with-non-code-files",[25],"several non-code file types",": side-by-side image comparison with swipe and onion-skin modes, CSV rendered as searchable tables, prose files with both source and rendered diff views, GeoJSON on Leaflet maps, ",[21,694,697],{"href":695,"rel":696},"https:\u002F\u002Fgithub.blog\u002Fnews-insights\u002Fproduct-news\u002F3d-file-diffs\u002F",[25],"STL files in a WebGL viewer",", Jupyter notebooks, and PDF rendering. These are all hardcoded server-side renderers with no user configuration. If your file type isn't on the list, you get \"Binary files differ\" in the web UI regardless of what your ",[29,700,57],{}," says.",[17,703,704,705,710,711,713],{},"GitLab has a similar set of built-in renderers (images, notebooks, CSV) with no extension mechanism. ",[21,706,709],{"href":707,"rel":708},"https:\u002F\u002Fgithub.com\u002Fgo-gitea\u002Fgitea\u002Fissues\u002F12288",[25],"Gitea has an open issue from 2020"," requesting custom diff rendering support, still unresolved. Forgejo inherits Gitea's limitation. None of these forges read or respect ",[29,712,660],{}," config from the repository, and none of them support textconv.",[17,715,716,568,721,726,727,732],{},[21,717,720],{"href":718,"rel":719},"https:\u002F\u002Fgithub.com\u002Fsublimehq\u002Fsublime_merge\u002Fissues\u002F428",[25],"Sublime Merge",[21,722,725],{"href":723,"rel":724},"https:\u002F\u002Fgithub.com\u002Fdesktop\u002Fdesktop\u002Fissues\u002F11524",[25],"GitHub Desktop",", and ",[21,728,731],{"href":729,"rel":730},"https:\u002F\u002Fgithub.com\u002Ffork-dev\u002FTrackerWin\u002Fissues\u002F1566",[25],"Fork"," all have open requests for textconv support too, some dating back years.",[17,734,735,736,738],{},"A textconv command is arbitrary code execution, and on a forge it would be triggered implicitly when someone opens a PR, with no confirmation step. CI gets away with running arbitrary user code because workflow execution is an explicit opt-in with a visible trust boundary, but diff rendering happens the moment you click on a file, so a malicious repo with a crafted ",[29,737,660],{}," config could execute code on the forge server without anyone choosing to run anything.",[17,740,741,742,746],{},"One way around this is installing textconv tools in the server's global gitconfig rather than reading config from repositories, which is what ",[21,743,745],{"href":707,"rel":744},[25],"Gitea issue #12288"," proposes. That shifts the burden to the forge operator, who has to choose which formats to support, install the tools, and maintain them, all for a feature most users don't know exists. GitHub's bespoke renderers sidestep the problem entirely by being richer than anything textconv can produce (interactive image sliders, searchable CSV tables, 3D model viewers) without executing any user-supplied commands.",[17,748,749,750,755],{},"GitHub and GitLab also use ",[21,751,754],{"href":752,"rel":753},"https:\u002F\u002Fgithub.com\u002Flibgit2\u002Flibgit2\u002Fblob\u002F52294c413100ed4930764addc69beadd82382a4c\u002Fsrc\u002Fuserdiff.h",[25],"libgit2"," rather than the git CLI, and executing external commands from a library embedded in a web application server is architecturally different from shelling out. libgit2 does have the built-in driver definitions though, so the hunk-header improvements from the 28 language drivers could be surfaced in web diffs without running any external commands at all.",[757,758,759],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":96,"searchDepth":163,"depth":163,"links":761},[762,763,764,765,766,767],{"id":36,"depth":169,"text":37},{"id":126,"depth":169,"text":127},{"id":240,"depth":169,"text":241},{"id":553,"depth":169,"text":554},{"id":650,"depth":169,"text":651},{"id":682,"depth":169,"text":683},"https:\u002F\u002Fnesbitt.io\u002F2026\u002F03\u002F30\u002Fgit-diff-drivers","nesbitt.io","tooling","2026-03-30","What git's diff drivers can do, from built-in language support to custom textconv filters.","md",false,null,{},"\u002Fideas\u002Fgit-diff-drivers",{"title":10,"description":772},"ideas\u002Fgit-diff-drivers","gWKVZH4nxDL0J8MQe0QXN39MaIei0lKm40rSjcvwo5g",1780596104940]