{"id":3440,"date":"2022-08-28T23:43:36","date_gmt":"2022-08-28T21:43:36","guid":{"rendered":"https:\/\/vielhuber.de\/?p=3440"},"modified":"2022-10-11T14:35:07","modified_gmt":"2022-10-11T12:35:07","slug":"git-historie-bereinigen-teil-2","status":"publish","type":"post","link":"https:\/\/vielhuber.de\/blog\/git-historie-bereinigen-teil-2\/","title":{"rendered":"Git Historie bereinigen Teil 2"},"content":{"rendered":"\n<p>Sensible Daten oder zu hoher Speicherplatzverbrauch: Es gibt gute Gr\u00fcnde den Wunsch zu hegen, die Git-Historie zu ver\u00e4ndern. <a href=\"https:\/\/vielhuber.de\/blog\/git-historie-bereinigen\/\">In diesem Blogbeitrag<\/a> habe ich erkl\u00e4rt, wie man mit Hilfe von <a href=\"https:\/\/rtyley.github.io\/bfg-repo-cleaner\/\" target=\"_blank\" rel=\"noreferrer noopener\">BFG<\/a> Dateien aus der Git-Historie tilgt. Ein Schwachpunkt von BFG ist die fehlende Unterst\u00fctzung von <a href=\"https:\/\/github.com\/rtyley\/bfg-repo-cleaner\/issues\/187\" target=\"_blank\" rel=\"noreferrer noopener\">direkten Pfaden<\/a>, sodass man nicht gezielt Dateien oder Ordner in Unterordnern aus der Historie entfernen kann. Damit ist es Zeit, alternative L\u00f6sungen anzusehen.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Neben dem <a href=\"https:\/\/git-scm.com\/docs\/git-filter-branch#SAFETY\" target=\"_blank\" rel=\"noreferrer noopener\">offiziell nicht empfohlenen<\/a> <a href=\"https:\/\/git-scm.com\/docs\/git-filter-branch\" target=\"_blank\" rel=\"noreferrer noopener\">git filter branch<\/a> z\u00e4hlt <a href=\"https:\/\/github.com\/newren\/git-filter-repo\" target=\"_blank\" rel=\"noreferrer noopener\">git-filter-repo<\/a> zu <em>dem<\/em> Werkzeug, die Bereinigung der Historie durchzuf\u00fchren. Nach einer kurzen <a href=\"https:\/\/github.com\/newren\/git-filter-repo\/blob\/main\/INSTALL.md\" target=\"_blank\" rel=\"noreferrer noopener\">Installation<\/a> analysieren wir zun\u00e4chst das Repository und finden beispielsweise die gr\u00f6\u00dften Ordner in der Historie:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git filter-repo --analyze<\/code><\/pre>\n\n\n\n<p>Nun werden im Ordner <code>.git\/filter-repo\/analysis<\/code> allerhand TXT-Dateien generiert:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><code>directories-all-sizes.txt<\/code><\/li><li><code>extensions-all-sizes.txt<\/code><\/li><li><code>path-all-sizes.txt<\/code><\/li><li>...<\/li><\/ul>\n\n\n\n<p>Es lohnt sich, die Datei <code>directories-all-sizes.txt<\/code> genauer anzusehen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>=== All directories by reverse size ===<br>\n<br>\nFormat: unpacked size, packed size, date deleted, directory name<br>\n<br>\n&nbsp;&nbsp;4624417043 3796607988 &lt;present&gt;  &lt;toplevel&gt;<br>\n&nbsp;&nbsp;4475940396 3778033787 &lt;present&gt;  wp-content<br>\n&nbsp;&nbsp;4060236681 3694449320 &lt;present&gt;  wp-content\/uploads<br>\n&nbsp;&nbsp;&nbsp;305163809&nbsp;&nbsp;&nbsp;70576241 &lt;present&gt;  wp-content\/plugins<br>\n&nbsp;&nbsp;&nbsp;123818107&nbsp;&nbsp;&nbsp;15442735 &lt;present&gt;  wp-includes<br>\n...<\/code><\/pre>\n\n\n\n<p>Es kommt oft vor, dass man l\u00e4ngst ignorierte und aus dem HEAD entfernte Daten in der Historie liegen hat (beispielsweise den WordPress-Medienordner <code>wp-content\/uploads\/<\/code> oder ein versehentlich gepushter <code>node_modules<\/code>- oder <code>vendor<\/code>-Ordner).<\/p>\n\n\n\n<p>Generell empfiehlt <code>git-filter-repo<\/code> nach der Bereinigung das Pushen in ein neues, leeres Repository. <a href=\"https:\/\/htmlpreview.github.io\/?https:\/\/github.com\/newren\/git-filter-repo\/blob\/docs\/html\/git-filter-repo.html#DISCUSSION\" target=\"_blank\" rel=\"noreferrer noopener\">Hier sind zahlreiche Gr\u00fcnde aufgef\u00fchrt<\/a>, warum dies sinnvoll ist und viele Probleme vermeidet. Trotzdem kann es vorkommen, dass man in dasselbe Repository pushen will und auch das ist unter Beachtung einiger Hinweise m\u00f6glich.<\/p>\n\n\n\n<p>Wichtig ist, dass die gro\u00dfen Code-Hosting-Plattformen <a href=\"https:\/\/github.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">GitHub<\/a> und <a href=\"https:\/\/about.gitlab.com\" target=\"_blank\" rel=\"noreferrer noopener\">GitLab<\/a> unterschiedliche Vorgehensweisen empfehlen, die sich teilweise voneinander unterscheiden. Auf GitHub entfernen wir beispielsweise <code>wp-content\/uploads\/<\/code> mit Hilfe der folgenden Schritte mit <code>git-filter-repo<\/code> aus der Historie:<\/p>\n\n\n\n<pre><code>mkdir tmp-repo\ncd tmp-repo\ngit clone git@github.com:foo\/bar.git .\ncp .git\/config \/tmp\/config-backup\ngit filter-repo --invert-paths --path wp-content\/uploads\/\n# option 1: same repo\n&nbsp;&nbsp;mv \/tmp\/config-backup .git\/config\n&nbsp;&nbsp;git push origin --force --all\n# option 2: new repo\n&nbsp;&nbsp;git remote add origin git@github.com:foo\/bar-new.git\n&nbsp;&nbsp;git push origin --force --all\ncd ..\nrm -rf tmp-repo<\/code><\/pre>\n\n\n\n<p>Wir k\u00f6nnen nun auch remote die Gr\u00f6\u00dfe pr\u00fcfen (die \u00c4nderung der Gr\u00f6\u00dfe via API sowie in der UI kann bis zu 24h dauern). Dazu \u00f6ffnet man die <a href=\"https:\/\/github.com\/settings\/repositories\" target=\"_blank\" rel=\"noreferrer noopener\">Repository-Einstellungen<\/a> (falls das Repository zu einer Organisation geh\u00f6rt, muss man vorher seinen eigenen Account zur Organisation hinzuf\u00fcgen). Nun sehen wir die Gr\u00f6\u00dfe:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"778\" height=\"172\" src=\"https:\/\/vielhuber.de\/wp-content\/uploads\/image-30.png\" alt=\"\" class=\"wp-image-3445\"\/><figcaption>GitHub: Speicherplatz vor der Bereinigung<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"776\" height=\"171\" src=\"https:\/\/vielhuber.de\/wp-content\/uploads\/image-31.png\" alt=\"\" class=\"wp-image-3446\"\/><figcaption>GitHub: Speicherplatz nach der Bereinigung<\/figcaption><\/figure>\n\n\n\n<p>Auf GitLab ist das Prozedere etwas anders:<\/p>\n\n\n\n<pre><code>mkdir tmp-repo\ncd tmp-repo\n# option 1: same repo\n&nbsp;&nbsp;# Settings &gt; General &gt; Advanced &gt; Export project &gt; download tar.gz file into tmp-repo\n&nbsp;&nbsp;tar xzf 20*.tar.gz\n&nbsp;&nbsp;git clone --bare --mirror project.bundle\n&nbsp;&nbsp;cd project.git\n&nbsp;&nbsp;git filter-repo --invert-paths --path wp-content\/uploads\/\n&nbsp;&nbsp;cp .\/filter-repo\/commit-map \/tmp\/commit-map-1\n&nbsp;&nbsp;# copying the commit-map has to be done after every single command from git filter-repo\n&nbsp;&nbsp;# you need the commit-map files later\n&nbsp;&nbsp;git remote remove origin\n&nbsp;&nbsp;git remote add origin git@gitlab.com:foo\/bar.git\n&nbsp;&nbsp;# Settings &gt; Repository &gt; Protected branches\/Protected branches &gt;\n&nbsp;&nbsp;# enable \"Allowed to force push to main\/master\"\n&nbsp;&nbsp;git push origin --force 'refs\/heads\/*'\n&nbsp;&nbsp;git push origin --force 'refs\/tags\/*'\n&nbsp;&nbsp;git push origin --force 'refs\/replace\/*'\n&nbsp;&nbsp;# Settings &gt; Repository &gt; Protected branches\/Protected branches &gt;\n&nbsp;&nbsp;# disable \"Allowed to force push to main\/master\"\n&nbsp;&nbsp;date\n&nbsp;&nbsp;# wait 30 minutes (\ud83d\ude31)\n&nbsp;&nbsp;date\n&nbsp;&nbsp;# Settings &gt; Repository &gt; upload \/tmp\/commit-map-X\n# option 2: new repo\n&nbsp;&nbsp;git clone git@gitlab.com:foo\/bar.git .\n&nbsp;&nbsp;git filter-repo --invert-paths --path wp-content\/uploads\/\n&nbsp;&nbsp;git remote add origin git@gitlab.com:foo\/bar-new.git\n&nbsp;&nbsp;# Settings &gt; Repository &gt; Protected branches\/Protected branches &gt;\n&nbsp;&nbsp;# enable \"Allowed to force push to main\/master\"\n&nbsp;&nbsp;git push origin --force --all\n&nbsp;&nbsp;# Settings &gt; Repository &gt; Protected branches\/Protected branches &gt;\n&nbsp;&nbsp;# disable \"Allowed to force push to main\/master\"\ncd ..\nrm -rf tmp-repo<\/code><\/pre>\n\n\n\n<p>Nach einer weiteren Wartezeit von ~5 Minuten k\u00f6nnen wir unter <code>Settings &gt; Usage Quotas<\/code> den Speicherplatz ansehen:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1261\" height=\"184\" src=\"https:\/\/vielhuber.de\/wp-content\/uploads\/image-32.png\" alt=\"\" class=\"wp-image-3447\"\/><figcaption>GitLab: Speicherplatz vor der Bereinigung<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1256\" height=\"184\" src=\"https:\/\/vielhuber.de\/wp-content\/uploads\/image-33.png\" alt=\"\" class=\"wp-image-3448\"\/><figcaption>GitLab: Speicherplatz nach der Bereinigung<\/figcaption><\/figure>\n\n\n\n<p>Nach dem Entfernen ist es wichtig, dass alle beteiligten Entwickler bei den letzten Schritten mitwirken: F\u00fchrt ein User mit seiner eigenen lokalen Kopie nun einen normalen push durch, w\u00fcrde dies dazu f\u00fchren, dass die gro\u00dfen Dateien wieder in das zentrale Repository wandern. Deshalb empfehlen sich die folgenden 3 M\u00f6glichkeiten:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\"poor man's fresh clone\"<ul><li><code>rm -rf .git &amp;&amp; git clone xxx temp &amp;&amp; mv temp\/.git .\/.git &amp;&amp; rm -rf temp<\/code><\/li><li>Bei ge\u00e4nderten Dateien (je nach Anwendungsfall): <code>git checkout -- .<\/code> bzw. <code>git add -A . &amp;&amp; git commit -m \"Push obscure file changes.\" &amp;&amp; git push<\/code><\/li><\/ul><\/li><li>\"start from scratch\"<ul><li><code>rm -rf repo &amp;&amp; git clone xxx .<\/code><\/li><\/ul><\/li><li>\"ugly pull with rebase\"<ul><li><code>git pull -r<\/code><\/li><li>Hier holt man hat immer noch die unbereinigte Historie, \u00fcberschreibt aber in den meisten F\u00e4llen aber nicht mehr versehentlich das Remote-Repository mit der gro\u00dfen lokalen Variante<\/li><\/ul><\/li><\/ul>\n\n\n\n<p>Im Zuge der aktuellen Quotas (insbesondere durch die neuen <a href=\"https:\/\/about.gitlab.com\/blog\/2022\/03\/24\/efficient-free-tier\/\" target=\"_blank\" rel=\"noreferrer noopener\">Einschr\u00e4nkungen von GitLab<\/a>) lohnt es sich allemal, die Gr\u00f6\u00dfe der Historie seiner Repositories zu pr\u00fcfen und ggf. zu bereinigen:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><\/td><td><strong>GitHub Free<\/strong><\/td><td><strong>GitLab Free<\/strong><\/td><\/tr><tr><td><strong>Max file size limit<\/strong><\/td><td>100 MB<\/td><td>\u221e<\/td><\/tr><tr><td><strong>Max repo size limit<\/strong><\/td><td>5.000 MB<\/td><td>\u221e<\/td><\/tr><tr><td><strong>Max repo count limit<\/strong><\/td><td>\u221e<\/td><td>\u221e<\/td><\/tr><tr><td><strong>Max overall size limit<\/strong><\/td><td>\u221e<\/td><td>5.000 MB<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Abschlie\u00dfend lohnt es sich auch, einen Blick auf eine selbst gehostete, kostenlose Variante wie <a href=\"https:\/\/gitea.io\" target=\"_blank\" rel=\"noreferrer noopener\">Gitea<\/a> zu werfen. Mit wenig Aufwand kann man auf einem <a href=\"https:\/\/docs.gitea.io\/en-us\/#system-requirements\" target=\"_blank\" rel=\"noreferrer noopener\">sehr schlanken Server<\/a> eine selbstgehostete Git-Instanz (GUI per <a href=\"https:\/\/docs.gitea.io\/en-us\/https-setup\/\" target=\"_blank\" rel=\"noreferrer noopener\">SSL<\/a> gesichert, <a href=\"https:\/\/docs.gitea.io\/en-us\/backup-and-restore\/\" target=\"_blank\" rel=\"noreferrer noopener\">Backup<\/a> inklusive, Steuerung \u00fcber <a href=\"https:\/\/docs.gitea.io\/en-us\/api-usage\/\" target=\"_blank\" rel=\"noreferrer noopener\">m\u00e4chtige API<\/a>) hosten, die sich obendrein hervorragend <a href=\"https:\/\/docs.gitea.io\/en-us\/config-cheat-sheet\/\" target=\"_blank\" rel=\"noreferrer noopener\">konfigurieren<\/a> l\u00e4sst und auch in Sachen Datenschutz \u00fcberlegen ist. Hier lassen sich \u00fcbrigens ebenfalls mit Hilfe von <code>git-filter-repo<\/code> Repositories einfach verschlanken:<\/p>\n\n\n\n<pre><code>mkdir tmp-repo\ncd tmp-repo\ngit clone git@git.tld.com:foo\/bar.git .\ncp .git\/config \/tmp\/config-backup\ngit filter-repo --invert-paths --path wp-content\/uploads\/\n# option 1: same repo\n&nbsp;&nbsp;mv \/tmp\/config-backup .git\/config\n&nbsp;&nbsp;git push origin --mirror\n&nbsp;&nbsp;# login on the remote command line and run in the repo-folder\n&nbsp;&nbsp;sudo -u git git reflog expire --expire=now --all\n&nbsp;&nbsp;sudo -u git git gc --aggressive --prune=now\n&nbsp;&nbsp;# if you face memory limit issues, modify the git configuration\n&nbsp;&nbsp;sudo -u git git config --global pack.windowMemory \"100m\"\n&nbsp;&nbsp;sudo -u git git config --global pack.packSizeLimit \"100m\"\n&nbsp;&nbsp;sudo -u git git config --global pack.threads \"1\"\n&nbsp;&nbsp;# if in web ui the size does not change, make a slight\n&nbsp;&nbsp;# modification to a file and push again normally\n# option 2: new repo\n&nbsp;&nbsp;git remote add origin git@git.tld.com:foo\/bar-new.git\n&nbsp;&nbsp;git push origin --force --all\ncd ..\nrm -rf tmp-repo<\/code><\/pre>\n\n\n\n<p>Hier ist speziell der Befehl <code>sudo -u git git gc --aggressive --prune=now<\/code> wichtig (das per Cron laufende <code>git gc<\/code> hat sonst eine zu lange <a href=\"https:\/\/git-scm.com\/docs\/git-gc#Documentation\/git-gc.txt---pruneltdategt\" target=\"_blank\" rel=\"noreferrer noopener\">prune-Time<\/a> von 2 Wochen).<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sensible Daten oder zu hoher Speicherplatzverbrauch: Es gibt gute Gr\u00fcnde den Wunsch zu hegen, die Git-Historie zu ver\u00e4ndern. In diesem Blogbeitrag habe ich erkl\u00e4rt, wie man mit Hilfe von BFG Dateien aus der Git-Historie tilgt. Ein Schwachpunkt von BFG ist die fehlende Unterst\u00fctzung von direkten Pfaden, sodass man nicht gezielt Dateien oder Ordner in Unterordnern [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"gtbabel_prevent_lngs":"","gtbabel_alt_lng":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-3440","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-blog"},"acf":[],"yoast_head":"<title>Git Historie bereinigen Teil 2 &#060; Vielhuber David<\/title>\n<meta name=\"description\" content=\"Sensible Daten oder zu hoher Speicherplatzverbrauch: Es gibt gute Gr\u00fcnde den Wunsch zu hegen, die Git-Historie zu ver\u00e4ndern. In diesem Blogbeitrag h...\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vielhuber.de\/blog\/git-historie-bereinigen-teil-2\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Git Historie bereinigen Teil 2 &#060; Vielhuber David\" \/>\n<meta property=\"og:description\" content=\"Sensible Daten oder zu hoher Speicherplatzverbrauch: Es gibt gute Gr\u00fcnde den Wunsch zu hegen, die Git-Historie zu ver\u00e4ndern. In diesem Blogbeitrag habe\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vielhuber.de\/blog\/git-historie-bereinigen-teil-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Vielhuber David\" \/>\n<meta property=\"article:published_time\" content=\"2022-08-28T21:43:36+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-10-11T12:35:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vielhuber.de\/wp-content\/uploads\/image-30.png\" \/>\n<meta name=\"author\" content=\"David\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@vielhuber\" \/>\n<meta name=\"twitter:site\" content=\"@vielhuber\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"David\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"7\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/git-historie-bereinigen-teil-2\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/git-historie-bereinigen-teil-2\\\/\"},\"author\":{\"name\":\"David\",\"@id\":\"https:\\\/\\\/vielhuber.de\\\/#\\\/schema\\\/person\\\/64d4ff14713d413ea4d9b210d0c2c6ef\"},\"headline\":\"Git Historie bereinigen Teil 2\",\"datePublished\":\"2022-08-28T21:43:36+00:00\",\"dateModified\":\"2022-10-11T12:35:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/git-historie-bereinigen-teil-2\\\/\"},\"wordCount\":577,\"publisher\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/#\\\/schema\\\/person\\\/64d4ff14713d413ea4d9b210d0c2c6ef\"},\"image\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/git-historie-bereinigen-teil-2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/vielhuber.de\\\/wp-content\\\/uploads\\\/image-30.png\",\"articleSection\":[\"Blog\"],\"inLanguage\":\"de\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/git-historie-bereinigen-teil-2\\\/\",\"url\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/git-historie-bereinigen-teil-2\\\/\",\"name\":\"Git Historie bereinigen Teil 2 &#060; Vielhuber David\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/git-historie-bereinigen-teil-2\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/git-historie-bereinigen-teil-2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/vielhuber.de\\\/wp-content\\\/uploads\\\/image-30.png\",\"datePublished\":\"2022-08-28T21:43:36+00:00\",\"dateModified\":\"2022-10-11T12:35:07+00:00\",\"description\":\"Sensible Daten oder zu hoher Speicherplatzverbrauch: Es gibt gute Gr\u00fcnde den Wunsch zu hegen, die Git-Historie zu ver\u00e4ndern. In diesem Blogbeitrag habe\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/git-historie-bereinigen-teil-2\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vielhuber.de\\\/blog\\\/git-historie-bereinigen-teil-2\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/git-historie-bereinigen-teil-2\\\/#primaryimage\",\"url\":\"https:\\\/\\\/vielhuber.de\\\/wp-content\\\/uploads\\\/image-30.png\",\"contentUrl\":\"https:\\\/\\\/vielhuber.de\\\/wp-content\\\/uploads\\\/image-30.png\",\"width\":778,\"height\":172},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/git-historie-bereinigen-teil-2\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vielhuber.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Git Historie bereinigen Teil 2\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vielhuber.de\\\/#website\",\"url\":\"https:\\\/\\\/vielhuber.de\\\/\",\"name\":\"Vielhuber David\",\"description\":\"Full-Stack Developer\",\"publisher\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/#\\\/schema\\\/person\\\/64d4ff14713d413ea4d9b210d0c2c6ef\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/vielhuber.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/vielhuber.de\\\/#\\\/schema\\\/person\\\/64d4ff14713d413ea4d9b210d0c2c6ef\",\"name\":\"David\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/vielhuber.de\\\/wp-content\\\/uploads\\\/about.jpg\",\"url\":\"https:\\\/\\\/vielhuber.de\\\/wp-content\\\/uploads\\\/about.jpg\",\"contentUrl\":\"https:\\\/\\\/vielhuber.de\\\/wp-content\\\/uploads\\\/about.jpg\",\"width\":700,\"height\":552,\"caption\":\"David\"},\"logo\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/wp-content\\\/uploads\\\/about.jpg\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/vielhuber\"]}]}<\/script>","yoast_head_json":{"title":"Git Historie bereinigen Teil 2 &#060; Vielhuber David","description":"Sensible Daten oder zu hoher Speicherplatzverbrauch: Es gibt gute Gr\u00fcnde den Wunsch zu hegen, die Git-Historie zu ver\u00e4ndern. In diesem Blogbeitrag h...","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vielhuber.de\/blog\/git-historie-bereinigen-teil-2\/","og_locale":"de_DE","og_type":"article","og_title":"Git Historie bereinigen Teil 2 &#060; Vielhuber David","og_description":"Sensible Daten oder zu hoher Speicherplatzverbrauch: Es gibt gute Gr\u00fcnde den Wunsch zu hegen, die Git-Historie zu ver\u00e4ndern. In diesem Blogbeitrag habe","og_url":"https:\/\/vielhuber.de\/blog\/git-historie-bereinigen-teil-2\/","og_site_name":"Vielhuber David","article_published_time":"2022-08-28T21:43:36+00:00","article_modified_time":"2022-10-11T12:35:07+00:00","og_image":[{"url":"https:\/\/vielhuber.de\/wp-content\/uploads\/image-30.png","type":"","width":"","height":""}],"author":"David","twitter_card":"summary_large_image","twitter_creator":"@vielhuber","twitter_site":"@vielhuber","twitter_misc":{"Verfasst von":"David","Gesch\u00e4tzte Lesezeit":"7\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vielhuber.de\/blog\/git-historie-bereinigen-teil-2\/#article","isPartOf":{"@id":"https:\/\/vielhuber.de\/blog\/git-historie-bereinigen-teil-2\/"},"author":{"name":"David","@id":"https:\/\/vielhuber.de\/#\/schema\/person\/64d4ff14713d413ea4d9b210d0c2c6ef"},"headline":"Git Historie bereinigen Teil 2","datePublished":"2022-08-28T21:43:36+00:00","dateModified":"2022-10-11T12:35:07+00:00","mainEntityOfPage":{"@id":"https:\/\/vielhuber.de\/blog\/git-historie-bereinigen-teil-2\/"},"wordCount":577,"publisher":{"@id":"https:\/\/vielhuber.de\/#\/schema\/person\/64d4ff14713d413ea4d9b210d0c2c6ef"},"image":{"@id":"https:\/\/vielhuber.de\/blog\/git-historie-bereinigen-teil-2\/#primaryimage"},"thumbnailUrl":"https:\/\/vielhuber.de\/wp-content\/uploads\/image-30.png","articleSection":["Blog"],"inLanguage":"de"},{"@type":"WebPage","@id":"https:\/\/vielhuber.de\/blog\/git-historie-bereinigen-teil-2\/","url":"https:\/\/vielhuber.de\/blog\/git-historie-bereinigen-teil-2\/","name":"Git Historie bereinigen Teil 2 &#060; Vielhuber David","isPartOf":{"@id":"https:\/\/vielhuber.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vielhuber.de\/blog\/git-historie-bereinigen-teil-2\/#primaryimage"},"image":{"@id":"https:\/\/vielhuber.de\/blog\/git-historie-bereinigen-teil-2\/#primaryimage"},"thumbnailUrl":"https:\/\/vielhuber.de\/wp-content\/uploads\/image-30.png","datePublished":"2022-08-28T21:43:36+00:00","dateModified":"2022-10-11T12:35:07+00:00","description":"Sensible Daten oder zu hoher Speicherplatzverbrauch: Es gibt gute Gr\u00fcnde den Wunsch zu hegen, die Git-Historie zu ver\u00e4ndern. In diesem Blogbeitrag habe","breadcrumb":{"@id":"https:\/\/vielhuber.de\/blog\/git-historie-bereinigen-teil-2\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vielhuber.de\/blog\/git-historie-bereinigen-teil-2\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/vielhuber.de\/blog\/git-historie-bereinigen-teil-2\/#primaryimage","url":"https:\/\/vielhuber.de\/wp-content\/uploads\/image-30.png","contentUrl":"https:\/\/vielhuber.de\/wp-content\/uploads\/image-30.png","width":778,"height":172},{"@type":"BreadcrumbList","@id":"https:\/\/vielhuber.de\/blog\/git-historie-bereinigen-teil-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vielhuber.de\/"},{"@type":"ListItem","position":2,"name":"Git Historie bereinigen Teil 2"}]},{"@type":"WebSite","@id":"https:\/\/vielhuber.de\/#website","url":"https:\/\/vielhuber.de\/","name":"Vielhuber David","description":"Full-Stack Developer","publisher":{"@id":"https:\/\/vielhuber.de\/#\/schema\/person\/64d4ff14713d413ea4d9b210d0c2c6ef"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vielhuber.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":["Person","Organization"],"@id":"https:\/\/vielhuber.de\/#\/schema\/person\/64d4ff14713d413ea4d9b210d0c2c6ef","name":"David","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/vielhuber.de\/wp-content\/uploads\/about.jpg","url":"https:\/\/vielhuber.de\/wp-content\/uploads\/about.jpg","contentUrl":"https:\/\/vielhuber.de\/wp-content\/uploads\/about.jpg","width":700,"height":552,"caption":"David"},"logo":{"@id":"https:\/\/vielhuber.de\/wp-content\/uploads\/about.jpg"},"sameAs":["https:\/\/x.com\/vielhuber"]}]}},"_links":{"self":[{"href":"https:\/\/vielhuber.de\/el\/wp-json\/wp\/v2\/posts\/3440","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vielhuber.de\/el\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vielhuber.de\/el\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vielhuber.de\/el\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vielhuber.de\/el\/wp-json\/wp\/v2\/comments?post=3440"}],"version-history":[{"count":62,"href":"https:\/\/vielhuber.de\/el\/wp-json\/wp\/v2\/posts\/3440\/revisions"}],"predecessor-version":[{"id":3535,"href":"https:\/\/vielhuber.de\/el\/wp-json\/wp\/v2\/posts\/3440\/revisions\/3535"}],"wp:attachment":[{"href":"https:\/\/vielhuber.de\/el\/wp-json\/wp\/v2\/media?parent=3440"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vielhuber.de\/el\/wp-json\/wp\/v2\/categories?post=3440"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vielhuber.de\/el\/wp-json\/wp\/v2\/tags?post=3440"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}