{"id":126,"date":"2009-07-08T22:30:23","date_gmt":"2009-07-09T05:30:23","guid":{"rendered":"http:\/\/blog.jausoft.com\/?p=126"},"modified":"2019-05-14T04:54:54","modified_gmt":"2019-05-14T08:54:54","slug":"svn-to-git-migration-1","status":"publish","type":"post","link":"https:\/\/jausoft.com\/blog\/2009\/07\/08\/svn-to-git-migration-1\/","title":{"rendered":"SVN to GIT migration (1)"},"content":{"rendered":"<h2>Preface<\/h2>\n<p>Abandoning <em>SVN<\/em> in our projects (gluegen, jogl and jogl-demos) for the various reasons, <a href=\"http:\/\/git.or.cz\/gitwiki\/GitSvnComparsion\">http:\/\/git.or.cz\/gitwiki\/GitSvnComparsion<\/a>,<br \/>\nwe had to choose a new SCM.<!--more--><\/p>\n<p>Here are some reasons why <em>git<\/em> wins over mercurial\/hg,<\/p>\n<ul>\n<li><a href=\"http:\/\/whygitisbetterthanx.com\/\">http:\/\/whygitisbetterthanx.com\/<\/a><\/li>\n<li><a href=\"http:\/\/importantshock.wordpress.com\/2008\/08\/07\/git-vs-mercurial\/\">http:\/\/importantshock.wordpress.com\/2008\/08\/07\/git-vs-mercurial\/<\/a>,<\/li>\n<li><a href=\"http:\/\/news.ycombinator.com\/item?id=577976\">http:\/\/news.ycombinator.com\/item?id=577976<\/a><\/li>\n<\/ul>\n<p>especially the branch\/merge handling, maturity and wide growing user base favors <em>git<\/em>.<br \/>\nHowever, it may also be just a matter of taste ..<\/p>\n<p>Some git resources:<\/p>\n<ul>\n<li><a href=\"http:\/\/git.or.cz\/gitwiki\/GitDocumentation\">git wiki<\/a><\/li>\n<li><a href=\"http:\/\/www.kernel.org\/pub\/software\/scm\/git\/docs\/gittutorial.html\">git tutorial<\/a><\/li>\n<li><a href=\"http:\/\/www.kernel.org\/pub\/software\/scm\/git\/docs\/everyday.html\">git everyday<\/a><\/li>\n<li><a href=\"http:\/\/ktown.kde.org\/~zrusin\/git\/git-cheat-sheet-medium.png\">git cheat sheet<\/a><\/li>\n<li><a href=\"http:\/\/git.or.cz\/course\/svn.html\">git crash course for svn users<\/a><\/li>\n<li><a href=\"http:\/\/www.kernel.org\/pub\/software\/scm\/git\/docs\/\">git documentation<\/a><\/li>\n<li><a href=\"http:\/\/code.google.com\/p\/msysgit\/\">msysgit &#8211; git for MS Windows<\/a><\/li>\n<\/ul>\n<h2><em>SVN<\/em> to <em>git<\/em> Conversion<\/h2>\n<p>The conversion demonstrated here is using the <em>dev.java.net <\/em>gluegen repository as an example, we have converted the<em> jogl <\/em>and<em> jogl-demos<\/em> the same way.<\/p>\n<p>We have used <strong><em>git<\/em> version 1.6.3.3.<\/strong><\/p>\n<p><span style=\"text-decoration: line-through;\">Instead of using <em>git-svn<\/em> directly, we utilize the tool <em>svn-all-fast-export<\/em>, <a href=\"http:\/\/repo.or.cz\/w\/svn-all-fast-export.git\">http:\/\/repo.or.cz\/w\/svn-all-fast-export.git,<br \/>\n<\/a>which not only uses a fast local <em>SVN<\/em> repository, but also migrates all local branches and tags to <em>git<\/em> branches.<br \/>\nThe latter is true, <em>SVN<\/em> tags converted to git branches, since <em>SVN<\/em> tags are actually branches.<\/span><\/p>\n<p><strong><em>Update: <\/em><\/strong>It turns out that the tool h<a href=\"http:\/\/repo.or.cz\/w\/svn-all-fast-export.git\">ttp:\/\/repo.or.cz\/w\/svn-all-fast-export.git<\/a><br \/>\nis not able to find the proper tag and branch points within the original repository,<br \/>\nhence we will use <a href=\"http:\/\/www.kernel.org\/pub\/software\/scm\/git\/docs\/v1.6.3.3\/git-svn.html\"><em>git-svn<\/em><\/a>.<\/p>\n<h3>Directory Layout<\/h3>\n<p>We assume the following layout ..<\/p>\n<pre>\/..\/JOGL\r\n\/..\/JOGL\/svn-server-sync\r\n\/..\/JOGL\/svn\r\n\/..\/JOGL\/git-svn<\/pre>\n<p>All subsequent action start from the root directory <em>JOGL<\/em>.<\/p>\n<h3><em>SVN<\/em> Preperation<\/h3>\n<h4>Clone Repository<\/h4>\n<p><strong><em>Update:<\/em><\/strong> This task is optional. However it is highly recommended since it dramatically speeds up the <em>SVN<\/em> checkout process.<\/p>\n<p>First we create a local clone of the <em>SVN<\/em> repository. This is already tricky, since the <em>svn<\/em> versions are not backward compatible,<br \/>\ni.e. <em>dev.java.net<\/em> <em>SVN<\/em> repository cannot be synchronized with <em>svn<\/em> version 1.6. The latest compatible version is <em>svn<\/em> 1.5.2.<br \/>\nHere we used an installed <em>svn<\/em> version 1.4.4 from a MacOSX machine!<\/p>\n<pre>1: mkdir svn-server-sync\r\n2: cd svn-server-sync\r\n3: svnadmin create gluegen\r\n4: cp gluegen\/hooks\/pre-revprop-change.tmpl gluegen\/hooks\/pre-revprop-change\r\n5: vi gluegen\/hooks\/pre-revprop-change\r\n6: chmod ugo+x gluegen\/hooks\/pre-revprop-change\r\n7: svnsync --username userid --password pwd init file:\/\/`pwd`\/gluegen <a class=\"linkification-ext\" title=\"Linkification: https:\/\/gluegen.dev.java.net\/svn\/gluegen\" href=\"https:\/\/gluegen.dev.java.net\/svn\/gluegen\">https:\/\/gluegen.dev.java.net\/svn\/gluegen<\/a>\r\n8: svnsync sync file:\/\/`pwd`\/gluegen<\/pre>\n<p>Step [1..3] create the local SVN repository.<\/p>\n<p>Steps [4..6] create the svn critical hook file and makes it writeable, while step 5 edits it as follows:<\/p>\n<pre>diff -Nur gluegen\/hooks\/pre-revprop-change.tmpl gluegen\/hooks\/pre-revprop-change\r\n--- gluegen\/hooks\/pre-revprop-change.tmpl\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2009-07-08 09:18:55.000000000 -0700\r\n+++ gluegen\/hooks\/pre-revprop-change\u00a0\u00a0\u00a0 2009-07-08 09:20:06.000000000 -0700\r\n@@ -60,6 +60,8 @@\r\n PROPNAME=\"$4\"\r\n ACTION=\"$5\"\r\n\r\n+exit 0\r\n+\r\n if [ \"$ACTION\" = \"M\" -a \"$PROPNAME\" = \"svn:log\" ]; then exit 0; fi\r\n\r\n echo \"Changing revision properties other than svn:log is prohibited\" &gt;&amp;2<\/pre>\n<p>Step 7 links the local SVN repository\u00a0 to it&#8217;s remote master.<\/p>\n<p>Step 8 finally pulls it down to our local copy.<\/p>\n<p>This is done for the <em>jogl<\/em> and<em> jogl-demos<\/em> repositories as well.<\/p>\n<h4>Create author mapping file<\/h4>\n<p>Create a <em>svn.authors<\/em> file, which maps the <em>svn<\/em> author names to <em>git<\/em> author names:<\/p>\n<pre>#!\/bin\/bash\r\nauthors=$(svn log -q | grep -e '^r' | awk 'BEGIN { FS = \"|\" } ; { print $2 }' | sort | uniq)\r\nfor author in ${authors}; do\r\n  echo \"${author} = ${author} &lt;${author}@dev.java.net&gt;\" &gt;&gt; svn.authors ;\r\ndone<\/pre>\n<p>Use the above script in all of your original checked-out svn repository directories (<em>gluegen, jogl <\/em>and<em> jogl-demos<\/em>) to catch all author names.<br \/>\nFix the <em>svn.authors<\/em> file&#8217;s email addresses if appropriate.<br \/>\nAdd the mandatory author names:<\/p>\n<pre>(no author) = First Last &lt;<a class=\"linkification-ext\" title=\"Linkification: mailto:no.author@domain.net\" href=\"mailto:no.author@domain.net\">no.author@domain.net<\/a>&gt;\r\ngfxadmin = gfxadmin &lt;<a class=\"linkification-ext\" title=\"Linkification: mailto:gfxadmin@domain.net\" href=\"mailto:gfxadmin@domain.net\">gfxadmin@domain.net<\/a>&gt;\r\nroot = root &lt;<a class=\"linkification-ext\" title=\"Linkification: mailto:root@domain.net\" href=\"mailto:root@domain.net\">root@domain.net<\/a>&gt;\r\nhttpd = httpd &lt;<a class=\"linkification-ext\" title=\"Linkification: mailto:httpd@domain.net\" href=\"mailto:httpd@domain.net\">httpd@domain.net<\/a>&gt;<\/pre>\n<h4>Move old local SVN repositories<\/h4>\n<p>We move away the old SVN checkouts ..<\/p>\n<pre>mkdir svn\r\nmv gluegen jogl jogl-demos svn\/<\/pre>\n<h3>Converting to git<\/h3>\n<h4>Preperation<\/h4>\n<p><span style=\"text-decoration: line-through;\">Get the tool svn-all-fast-export, <a href=\"http:\/\/repo.or.cz\/w\/svn-all-fast-export.git\">http:\/\/repo.or.cz\/w\/svn-all-fast-export.git<\/a>, via git clone git:\/\/<a title=\"Linkification: http:\/\/repo.or.cz\/svn-all-fast-export.git\" href=\"http:\/\/repo.or.cz\/svn-all-fast-export.git\">repo.or.cz\/svn-all-fast-export.git<\/a>, build and install it.<\/span><\/p>\n<p>Go our parent directory <em>JOGL<\/em>, where <em>svn-server-sync<\/em> resides.<\/p>\n<pre>mkdir git-svn\r\ncd git-svn<\/pre>\n<p>Copy the previously created <em>svn.authors<\/em> file to this directory <em>git-svn<\/em>.<\/p>\n<p><span style=\"text-decoration: line-through;\">Copy the file <em>merged-branches-tags.rules<\/em> out of the checked out <em>svn-all-fast-export.git<\/em><br \/>\nrepository, <em>svn-all-fast-export\/samples\/merged-branches-tags.rules<\/em>, to this directory <em>git-svn<\/em>.<\/span><\/p>\n<h4>Converting<\/h4>\n<pre>cd git-svn<\/pre>\n<p><span style=\"text-decoration: line-through;\">We customize the <em>svn-all-fast-export<\/em> configuration file, here for gluegen:<\/span><span style=\"text-decoration: line-through;\"><br \/>\nsed &#8216;s\/myproject\/gluegen\/g&#8217; merged-branches-tags.rules &gt; gluegen-merged-branches-tags.rules<\/span><\/p>\n<pre>git svn --authors-file=.\/svn.authors clone -s file:\/\/`pwd`\/..\/svn-server-sync\/gluegen gluegen 2&gt;&amp;1 | tee gluegen.log<\/pre>\n<p>This task migrates the <em>SVN<\/em> repository to <em>git<\/em>, note that all tags of the <em>SVN<\/em> repository are represented as branches within <em>git<\/em>,<br \/>\nwhich we will fix within the next step. Don&#8217;t forget to check the log file, here gluegen.log.<\/p>\n<p>In case somethings goes wrong, ie the task is incompete, e.g. due to a missing author-name mapping,<br \/>\nfix that error (add author-name to svn.authors) and continue:<\/p>\n<pre>cd gluegen\r\ngit svn --authors-file=..\/svn.authors fetch\u00a0 2&gt;&amp;1 | tee ..\/gluegen-2.log<\/pre>\n<h4>Pick remote branches &amp; manual tagging<\/h4>\n<pre>cd git-svn\/gluegen<\/pre>\n<p>The converted repository has referenced branches to the remote <em>SVN<\/em> origin,<br \/>\nwe have to pick these and make them local.<\/p>\n<p>Also, as mentioned above, <em>SVN<\/em> tags are actually branches, so we have to converted them to <em>git<\/em> tags.<\/p>\n<pre>git branch -a\r\n* master\r\n  remotes\/1.0b06-maint\r\n  remotes\/1.0b06a\r\n  remotes\/JOGL_2_SANDBOX\r\n  remotes\/tags\/1.0b06\r\n  remotes\/tags\/1.0b06a\r\n  remotes\/trunk\r\ngit tag -l<\/pre>\n<p>The above shows us a few remote branches and no tags.<\/p>\n<p>We have to distinguish the remote branches from the tags,<br \/>\nwhich is easy at looking at the <a href=\"https:\/\/gluegen.dev.java.net\/source\/browse\/gluegen\/branches\/\"><em>SVN<\/em> branches page<\/a>.\u00a0 Valid remote branches are <em>1.0b06-maint<\/em> and the <em>JOGL_2_SANDBOX.<\/em><br \/>\nThe below commands create local branches from the remote ones.<em><br \/>\n<\/em><\/p>\n<pre>git checkout --track -b 1.0b06-maint remotes\/1.0b06-maint\r\ngit checkout --track -b JOGL_2_SANDBOX remotes\/JOGL_2_SANDBOX<\/pre>\n<p>Last but not least, we have to manually create <em>git <\/em>tags from the fake <em>SVN<\/em> tags, which are visible as <em>remotes\/tags\/*<\/em> branches.<\/p>\n<pre>1: git checkout --track -b tag_1.0b06 remotes\/tags\/1.0b06\r\n2: git checkout --track -b tag_1.0b06a remotes\/tags\/1.0b06a\r\n3: git checkout master\r\n4: git tag 1.0b06 tag_1.0b06\r\n5: git tag 1.0b06a tag_1.0b06a\r\n6: git branch -D tag_1.0b06 tag_1.0b06a\r\n7: git branch -a\r\n  1.0b06-maint\r\n  JOGL_2_SANDBOX\r\n* master\r\n  remotes\/1.0b06-maint\r\n  remotes\/1.0b06a\r\n  remotes\/JOGL_2_SANDBOX\r\n  remotes\/tags\/1.0b06\r\n  remotes\/tags\/1.0b06a\r\n  remotes\/trunk\r\n8: git tag -l\r\n  1.0b06\r\n  1.0b06a\r\n9: git branch -r -D 1.0b06-maint 1.0b06a JOGL_2_SANDBOX tags\/1.0b06 tags\/1.0b06a trunk\r\nX: git branch -a\r\n  1.0b06-maint\r\n  JOGL_2_SANDBOX\r\n* master<\/pre>\n<p>Step [1..2] creates local branches with the prefix tag_ from the remote ones.<br \/>\nStep 3 switches back to the master branch<br \/>\nStep [4..5] creates tags from the local branches<br \/>\nStep 6 deletes the local branches, which we just have tagged.<br \/>\nStep 7 shows the branches<br \/>\nStep 8 shows the tags<br \/>\nStep 9 removes the remote branches, which disconnects us from the svn repository<br \/>\nStep X: shows the branches<\/p>\n<p>In case you have many branches, you may use a simple shell script, fed with a file containing the branch names,<br \/>\nwithout the ref-path (remotes\/)<\/p>\n<pre>#! \/bin\/sh\r\n\r\nbranchfile=$1\r\nshift\r\n\r\nif [ -z \"$branchfile\" ] ; then\r\n    echo Usage $0 branchfile containing branchnames without ref path\r\n    exit 1\r\nfi\r\n\r\nfor i in `cat $branchfile` ; do\r\n    git checkout --track -b $i remotes\/$i\r\n    git checkout master\r\n    git branch -r -D $i\r\ndone<\/pre>\n<p>In case you have many tags, you may use a simple shell script, fed with a file containing the tag names,<br \/>\nwithout the ref-path (remotes\/tags\/)<\/p>\n<pre>#! \/bin\/sh\r\n\r\ntagfile=$1\r\nshift\r\n\r\nif [ -z \"$tagfile\" ] ; then\r\n    echo Usage $0 tagfile containing tagnames without ref path\r\n    exit 1\r\nfi\r\n\r\nfor i in `cat $tagfile` ; do\r\n    git checkout --track -b tag_\"$i\" remotes\/tags\/$i\r\n    git tag $i tag_\"$i\"\r\n    git checkout master\r\n    git branch -D tag_\"$i\"\r\n    git branch -r -D tags\/$i\r\ndone<\/pre>\n<h4>Cleanup<\/h4>\n<pre>\r\n<\/pre>\n<pre>1: cd git-svn\/gluegen\r\n2: git gc\r\n3: cd ..\r\n4: git clone --mirror gluegen gluegen.git<\/pre>\n<p>Since the conversion left a lot of dirt in the <em>git<\/em> repository, and we have joggled around with a lot branches,<br \/>\nwe want to manually garbage collect (gc) our folder with the Step 2.<br \/>\nStep 4 creates a bare mirror clone of the cleaned up git repository, you may like to use this as a backup.<\/p>\n<p>Pre cleanup: 15MByte, post cleanup 6.6MByte, bare mirror 2.7M.<\/p>\n<h4>Publish <em>git <\/em>repository to the server<\/h4>\n<pre>cd git-svn\/gluegen.git<\/pre>\n<p>Now we push our conversion to the <em>git<\/em> server&#8217;s repository:<\/p>\n<pre>git push --mirror ssh:\/\/<a title=\"Linkification: http:\/\/svengothel@git.kenai.com\/gluegen~gluegen-git\" href=\"http:\/\/svengothel@git.kenai.com\/gluegen~gluegen-git\">username@git.kenai.com\/gluegen~gluegen-git<\/a><\/pre>\n<p>The mirror option ensures a 1:1 copy including all branches and tags.<\/p>\n<h2><em>git<\/em> Usage<\/h2>\n<p>We assume to be in our root directory <em>JOGL<\/em>.<\/p>\n<p>No more <em>gluegen<\/em>, <em>jogl<\/em> or<em> jogl-demos<\/em> directory exist anymore, since we moved it away to the new subdirectory <em>svn<\/em>.<\/p>\n<h3>Clone<\/h3>\n<pre>1a: git clone git:\/\/<a class=\"linkification-ext\" title=\"Linkification: http:\/\/kenai.com\/gluegen~gluegen-git\" href=\"http:\/\/kenai.com\/gluegen~gluegen-git\">kenai.com\/gluegen~gluegen-git<\/a>\u00a0 gluegen\r\n1b: git clone ssh:\/\/<a title=\"Linkification: http:\/\/svengothel@git.kenai.com\/gluegen~gluegen-git\" href=\"http:\/\/svengothel@git.kenai.com\/gluegen~gluegen-git\">username@git.kenai.com\/gluegen~gluegen-git<\/a> gluegen\r\n2: cd gluegen\r\n3: git branch -a\r\n4: git remote show origin<\/pre>\n<p>Step <em>1a<\/em> or <em>1b<\/em> creates the local <em>gluegen git<\/em> clone in the directory <em>gluegen<\/em>,<br \/>\nwhere <em>1a<\/em> is the anonymous checkout and <em>1b<\/em> uses the SSH login shell remote connection,<br \/>\nthe latter is recommended for putbacks.<\/p>\n<p>Step 2 cd&#8217;s into it.<\/p>\n<p>Step 3 lists all branches.<\/p>\n<p>Step 4 shows remote tracked branches<\/p>\n<h3>Checkout a remote tracked branch<\/h3>\n<p>In case you like to browse around within some branch, which is not yet local, ie remote,<br \/>\nyou have to checkout the remote one to become local, ie the <em>JOGL_2_SANDBOX<\/em>.<\/p>\n<pre>git remote show origin\r\ngit checkout --track -b JOGL_2_SANDBOX origin\/JOGL_2_SANDBOX\r\ngit checkout JOGL_2_SANDBOX<\/pre>\n<p>Then you can switch between local branches as usual ..<\/p>\n<h3>Switch local branches<\/h3>\n<pre>git checkout JOGL_2_SANDBOX\r\ngit checkout master<\/pre>\n<h3>Remove a remote branch on server<\/h3>\n<p>You may have created and published the new branch <em>my_branch<\/em> derived from <em>master<\/em>:<\/p>\n<pre>git branch --track my_branch origin\/master\r\ngit checkout my_branch\r\n.. changes ..\r\npit push --all<\/pre>\n<p>.. or you were using a remote branch ..<\/p>\n<pre>git checkout --track -b my_branch origin\/my_branch\r\ngit checkout my_branch\r\n.. changes ..\r\ngit push --all<\/pre>\n<p>Now we like to remove the branch <em>my_branch<\/em>,<br \/>\nand remove it on the server as well.<\/p>\n<pre>1: git branch -D my_branch\r\n2: git push origin :refs\/heads\/my_branch<\/pre>\n<p>Step 1 removes the branch <em>my_branch<\/em> in the local repository.<br \/>\nStep 2 removes the branch <em>my_branch<\/em> on the server repository.<\/p>\n<p>Another user may want to clean up the local repository, ie remove a tracked remote branch:<\/p>\n<pre>1: git branch -r -D origin\/my_branch\r\n2: git fetch<\/pre>\n<h3>Last but not least &#8230;<\/h3>\n<p>.. <a href=\"http:\/\/www.kernel.org\/pub\/software\/scm\/git\/docs\/everyday.html#Individual%20Developer%20%28Participant%29\">participation and contributions<\/a>.<\/p>\n<p><em>Git&#8217;s<\/em> model is <strong>not<\/strong> really layed out for central SCM,<br \/>\nsure it can be abused as such, as you have seen above.<\/p>\n<p>It&#8217;s real powers are it&#8217;s <strong>distribution qualities<\/strong>!<\/p>\n<p>Either a contributor has it&#8217;s own repository online via a webserver or ssh access,<br \/>\nor she can send the patch via email.<br \/>\nHowever it is offered to an integrator within the chain of trust (in a project),<br \/>\nshe asks the integrator to pull the branch via the mentioned online or email content.<br \/>\nThe integrator then verifies the patch somehow and merges it to her own branch, etc etc.<br \/>\nThese are the key features of <em>git<\/em>,<br \/>\na very reliable high performance <strong>branching<\/strong> and <strong>merging<\/strong>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Preface Abandoning SVN in our projects (gluegen, jogl and jogl-demos) for the various reasons, http:\/\/git.or.cz\/gitwiki\/GitSvnComparsion, we had to choose a new SCM.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[3,8,6],"tags":[15,44,38,19],"class_list":["post-126","post","type-post","status-publish","format-standard","hentry","category-computer-stuff","category-jogamp","category-scm","tag-git","tag-jogamp","tag-scm","tag-svn"],"_links":{"self":[{"href":"https:\/\/jausoft.com\/blog\/wp-json\/wp\/v2\/posts\/126","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jausoft.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jausoft.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jausoft.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jausoft.com\/blog\/wp-json\/wp\/v2\/comments?post=126"}],"version-history":[{"count":1,"href":"https:\/\/jausoft.com\/blog\/wp-json\/wp\/v2\/posts\/126\/revisions"}],"predecessor-version":[{"id":591,"href":"https:\/\/jausoft.com\/blog\/wp-json\/wp\/v2\/posts\/126\/revisions\/591"}],"wp:attachment":[{"href":"https:\/\/jausoft.com\/blog\/wp-json\/wp\/v2\/media?parent=126"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jausoft.com\/blog\/wp-json\/wp\/v2\/categories?post=126"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jausoft.com\/blog\/wp-json\/wp\/v2\/tags?post=126"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}