<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Taras Shkodenko</title>
    <description>The latest articles on DEV Community by Taras Shkodenko (@podlom).</description>
    <link>https://dev.to/podlom</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1058137%2F26125d2e-e504-46e0-8c5a-0dfdf40af4cd.jpeg</url>
      <title>DEV Community: Taras Shkodenko</title>
      <link>https://dev.to/podlom</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/podlom"/>
    <language>en</language>
    <item>
      <title>How to create a simple IP address tracker with geolocation in Symfony 6+</title>
      <dc:creator>Taras Shkodenko</dc:creator>
      <pubDate>Sun, 15 Jun 2025 19:42:11 +0000</pubDate>
      <link>https://dev.to/podlom/how-to-create-a-simple-ip-address-tracker-with-geolocation-in-symfony-6-1i0m</link>
      <guid>https://dev.to/podlom/how-to-create-a-simple-ip-address-tracker-with-geolocation-in-symfony-6-1i0m</guid>
      <description>&lt;p&gt;💻 Recently, I've built a lightweight IP tracker using Symfony 6+ 🚀&lt;br&gt;
This mini project logs user IPs, fetches their geolocation from an API, and stores the results using Doctrine.&lt;br&gt;
Frontend uses Twig to display country and city.&lt;br&gt;
Great intro to Symfony services, entity management, and API integration.&lt;br&gt;
Check it out and feel free to fork, tweak, or suggest improvements! 🙌&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.patreon.com/posts/how-to-create-ip-131537987?utm_medium=clipboard_copy&amp;amp;utm_source=copyLink&amp;amp;utm_campaign=postshare_creator&amp;amp;utm_content=join_link" rel="noopener noreferrer"&gt;https://www.patreon.com/posts/how-to-create-ip-131537987?utm_medium=clipboard_copy&amp;amp;utm_source=copyLink&amp;amp;utm_campaign=postshare_creator&amp;amp;utm_content=join_link&lt;/a&gt;&lt;/p&gt;

</description>
      <category>symfony</category>
      <category>php</category>
      <category>geolocation</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Clean Git History from Secrets Using BFG Repo-Cleaner (Ubuntu-Friendly Guide)</title>
      <dc:creator>Taras Shkodenko</dc:creator>
      <pubDate>Tue, 08 Apr 2025 18:37:15 +0000</pubDate>
      <link>https://dev.to/podlom/how-to-clean-git-history-from-secrets-using-bfg-repo-cleaner-ubuntu-friendly-guide-21c4</link>
      <guid>https://dev.to/podlom/how-to-clean-git-history-from-secrets-using-bfg-repo-cleaner-ubuntu-friendly-guide-21c4</guid>
      <description>&lt;h1&gt;
  
  
  🔒 How to Clean Git History from Secrets Using BFG Repo-Cleaner (Ubuntu-Friendly Guide)
&lt;/h1&gt;

&lt;p&gt;Have you ever accidentally committed &lt;strong&gt;secrets&lt;/strong&gt; like database credentials or API keys to your Git repository? Don’t panic — you can clean your repo history and protect your sensitive data.&lt;/p&gt;

&lt;p&gt;In this post, I’ll walk you through using &lt;strong&gt;BFG Repo-Cleaner&lt;/strong&gt; to scrub secrets from Git history — with simple step-by-step instructions and working commands for Ubuntu Linux users.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ Why This Matters
&lt;/h2&gt;

&lt;p&gt;Once a secret is committed, &lt;strong&gt;it lives in your Git history&lt;/strong&gt;. Even if you delete the line or file, it's still retrievable unless you &lt;strong&gt;rewrite&lt;/strong&gt; the history.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧰 Tools We’ll Use
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;BFG Repo-Cleaner&lt;/strong&gt; – a fast alternative to &lt;code&gt;git filter-branch&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Java Runtime&lt;/strong&gt; (required to run the BFG &lt;code&gt;.jar&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🐧 Step-by-Step Guide (Ubuntu Linux)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Step 1: Install Java
&lt;/h3&gt;

&lt;p&gt;BFG requires Java to run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;default-jre &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ✅ Step 2: Download BFG Repo-Cleaner
&lt;/h3&gt;

&lt;p&gt;Grab the latest .jar from Maven Central:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget https://repo1.maven.org/maven2/com/madgag/bfg/1.14.0/bfg-1.14.0.jar &lt;span class="nt"&gt;-O&lt;/span&gt; bfg.jar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can now run it via:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;java &lt;span class="nt"&gt;-jar&lt;/span&gt; bfg.jar &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ✅ Step 3: Clone Your Repository in Mirror Mode
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &lt;span class="nt"&gt;--mirror&lt;/span&gt; https://github.com/your-username/your-website.com.git
&lt;span class="nb"&gt;cd &lt;/span&gt;your-website.com.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The --mirror option ensures we get all refs and branches for complete cleanup.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Step 4: Define Secrets to Remove
&lt;/h3&gt;

&lt;p&gt;Create a secrets.txt file with strings you want to remove from the entire history:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DB_PASSWORD
DB_USERNAME
google_recaptcha_secret
my_old_secret_key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔐 These can be full strings or patterns. BFG will replace them with [REMOVED].&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Step 5: Run BFG
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;java &lt;span class="nt"&gt;-jar&lt;/span&gt; ../bfg.jar &lt;span class="nt"&gt;--replace-text&lt;/span&gt; secrets.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or to delete sensitive files completely (e.g., .env):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;java &lt;span class="nt"&gt;-jar&lt;/span&gt; ../bfg.jar &lt;span class="nt"&gt;--delete-files&lt;/span&gt; .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ✅ Step 6: Cleanup and Optimize
&lt;/h3&gt;

&lt;p&gt;After BFG has done its job, run the following to clean and compact the repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git reflog expire &lt;span class="nt"&gt;--expire&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;now &lt;span class="nt"&gt;--all&lt;/span&gt;
git gc &lt;span class="nt"&gt;--prune&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;now &lt;span class="nt"&gt;--aggressive&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ✅ Step 7: Force Push the Cleaned Repo
&lt;/h3&gt;

&lt;p&gt;⚠️ This rewrites history, so collaborators must re-clone the repo afterward.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push &lt;span class="nt"&gt;--force&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ✅ Bonus: Make BFG Globally Available (Optional)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mv &lt;/span&gt;bfg.jar /usr/local/bin/bfg.jar
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'alias bfg="java -jar /usr/local/bin/bfg.jar"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can run BFG anywhere with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bfg &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🔎 How to Verify That Secrets Are Gone
&lt;/h3&gt;

&lt;p&gt;Use Git's search to confirm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log &lt;span class="nt"&gt;-S&lt;/span&gt;&lt;span class="s1"&gt;'some_secret_string'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🚨 Don’t Forget to Rotate Secrets
&lt;/h3&gt;

&lt;p&gt;Even after removing secrets from history, treat them as compromised and rotate them immediately (update DB users, regenerate API keys, etc.).&lt;/p&gt;




&lt;h3&gt;
  
  
  📦 Alternatives to BFG
&lt;/h3&gt;

&lt;p&gt;If you're working on more complex history rewrites, also consider:&lt;/p&gt;

&lt;p&gt;[git filter-repo] – the official successor to filter-branch&lt;br&gt;
[git filter-branch] – powerful but slow and error-prone&lt;/p&gt;




&lt;h3&gt;
  
  
  🤝 Conclusion
&lt;/h3&gt;

&lt;p&gt;Mistakes happen, and leaking secrets in Git is more common than you'd think. Luckily, tools like BFG make it fast and easy to clean your repo and start fresh.&lt;/p&gt;

&lt;p&gt;If you found this helpful, share it with your team or developer community — and let’s keep our code (and secrets) safe. 🛡️&lt;/p&gt;

</description>
      <category>ubuntu</category>
      <category>linux</category>
      <category>git</category>
      <category>security</category>
    </item>
    <item>
      <title>Ultimate Guide to Installing Software on Ubuntu 24.04</title>
      <dc:creator>Taras Shkodenko</dc:creator>
      <pubDate>Wed, 19 Feb 2025 20:14:47 +0000</pubDate>
      <link>https://dev.to/podlom/ultimate-guide-to-installing-software-on-ubuntu-2404-309i</link>
      <guid>https://dev.to/podlom/ultimate-guide-to-installing-software-on-ubuntu-2404-309i</guid>
      <description>&lt;p&gt;🔍 Installing software on Ubuntu 24.04 is easier than you think! Learn the best methods, including Snap, Flatpak, and PPA, in this ultimate guide.&lt;br&gt;
📖 Read here: &lt;a href="https://www.patreon.com/posts/ultimate-guide-122622084?utm_medium=clipboard_copy&amp;amp;utm_source=copyLink&amp;amp;utm_campaign=postshare_creator&amp;amp;utm_content=join_link" rel="noopener noreferrer"&gt;&lt;/a&gt; #Linux #Ubuntu24_04&lt;/p&gt;

</description>
      <category>ubuntu</category>
      <category>linux</category>
      <category>software</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Trimming the Last Character from a String in Bash</title>
      <dc:creator>Taras Shkodenko</dc:creator>
      <pubDate>Mon, 05 Feb 2024 17:40:17 +0000</pubDate>
      <link>https://dev.to/podlom/trimming-the-last-character-from-a-string-in-bash-51l1</link>
      <guid>https://dev.to/podlom/trimming-the-last-character-from-a-string-in-bash-51l1</guid>
      <description>&lt;p&gt;Check out a tutorial on &lt;a href="https://www.shkodenko.com/trimming-the-last-character-from-a-string-in-bash/"&gt;bash scripting and strings manipulation in Linux&lt;/a&gt;&lt;/p&gt;

</description>
      <category>bash</category>
      <category>scripting</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Efficiently Adding Multiple Lines to Files in Linux</title>
      <dc:creator>Taras Shkodenko</dc:creator>
      <pubDate>Tue, 16 Jan 2024 12:02:27 +0000</pubDate>
      <link>https://dev.to/podlom/efficiently-adding-multiple-lines-to-files-in-linux-51b6</link>
      <guid>https://dev.to/podlom/efficiently-adding-multiple-lines-to-files-in-linux-51b6</guid>
      <description>&lt;p&gt;Hacking configuration files on Linux servers could be a difficult task. A new blog post on &lt;a href="https://www.shkodenko.com/efficiently-adding-multiple-lines-to-files-in-linux/"&gt;working with a multiple lines in Linux with tee command&lt;/a&gt; could be useful for your daily work.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>tutorial</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Manage multiple PostgreSQL server versions on Ubuntu Linux machine</title>
      <dc:creator>Taras Shkodenko</dc:creator>
      <pubDate>Tue, 09 Jan 2024 11:50:33 +0000</pubDate>
      <link>https://dev.to/podlom/manage-multiple-postgresql-server-versions-on-ubuntu-linux-machine-5972</link>
      <guid>https://dev.to/podlom/manage-multiple-postgresql-server-versions-on-ubuntu-linux-machine-5972</guid>
      <description>&lt;p&gt;It could be useful to &lt;a href="https://www.shkodenko.com/managing-multiple-postgresql-versions-on-ubuntu-linux-a-guide-to-using-pg_dump-with-different-server-versions/"&gt;manage multile PosgreSQL database server versions on a Linux Ubuntu machine&lt;/a&gt;&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>linux</category>
    </item>
    <item>
      <title>Converting Space-Separated Strings to Arrays in Bash Scripts</title>
      <dc:creator>Taras Shkodenko</dc:creator>
      <pubDate>Tue, 19 Dec 2023 13:15:05 +0000</pubDate>
      <link>https://dev.to/podlom/converting-space-separated-strings-to-arrays-in-bash-scripts-1lli</link>
      <guid>https://dev.to/podlom/converting-space-separated-strings-to-arrays-in-bash-scripts-1lli</guid>
      <description>&lt;p&gt;Read a blog post about &lt;a href="https://www.shkodenko.com/converting-space-separated-strings-to-arrays-in-bash-scripts/"&gt;Converting Space-Separated Strings to Arrays in Bash Scripts&lt;/a&gt;&lt;/p&gt;

</description>
      <category>bash</category>
      <category>linux</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>What is the difference between print and echo in PHP</title>
      <dc:creator>Taras Shkodenko</dc:creator>
      <pubDate>Fri, 15 Dec 2023 15:18:29 +0000</pubDate>
      <link>https://dev.to/podlom/what-is-the-difference-between-print-and-echo-in-php-3j0l</link>
      <guid>https://dev.to/podlom/what-is-the-difference-between-print-and-echo-in-php-3j0l</guid>
      <description>&lt;p&gt;Check out a blog post: &lt;a href="https://www.shkodenko.com/what-is-the-difference-between-print-in-echo-in-php/"&gt;What is the difference between print and echo in PHP&lt;/a&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>webdev</category>
      <category>coding</category>
      <category>website</category>
    </item>
    <item>
      <title>PHP code sniffer</title>
      <dc:creator>Taras Shkodenko</dc:creator>
      <pubDate>Thu, 05 Oct 2023 12:35:45 +0000</pubDate>
      <link>https://dev.to/podlom/php-code-sniffer-2j0a</link>
      <guid>https://dev.to/podlom/php-code-sniffer-2j0a</guid>
      <description>&lt;p&gt;&lt;a href="https://t.me/phpdinos/5"&gt;PHP code sniffer&lt;/a&gt; - a good way to keep your codebase clean.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://t.me/phpdinos"&gt;Join the PHP Dinos Telegram Channel&lt;/a&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>webdev</category>
      <category>coding</category>
      <category>website</category>
    </item>
    <item>
      <title>Improved Docker setup for MySQL access generator utility</title>
      <dc:creator>Taras Shkodenko</dc:creator>
      <pubDate>Sun, 20 Aug 2023 08:39:26 +0000</pubDate>
      <link>https://dev.to/podlom/improved-docker-setup-for-mysql-access-generator-utility-1kgo</link>
      <guid>https://dev.to/podlom/improved-docker-setup-for-mysql-access-generator-utility-1kgo</guid>
      <description>&lt;p&gt;Check out MySQL database access generator utility on GitHub at &lt;a href="https://github.com/podlom/generate-mysql-db-access"&gt;github.com/podlom/generate-mysql-db-access&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It uses my &lt;a href="https://rndpwd.info/"&gt;Random Password Generator&lt;/a&gt; service to make MySQL database passwords.&lt;/p&gt;

</description>
      <category>mysql</category>
      <category>database</category>
      <category>generator</category>
      <category>utility</category>
    </item>
    <item>
      <title>Linux tutorial: bulk files rename shell bash script</title>
      <dc:creator>Taras Shkodenko</dc:creator>
      <pubDate>Fri, 18 Aug 2023 14:15:20 +0000</pubDate>
      <link>https://dev.to/podlom/linux-tutorial-bulk-files-rename-shell-bash-script-2g76</link>
      <guid>https://dev.to/podlom/linux-tutorial-bulk-files-rename-shell-bash-script-2g76</guid>
      <description>&lt;p&gt;So, here is the tutorial on how to make bulk file rename on Linux Terminal using Bash scripting:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.shkodenko.com/bulk-files-rename-shell-script-for-linux/"&gt;Bulk files rename shell script for Linux&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gist.github.com/podlom/30ce9f2af87ca1d8013944c31d0edc2f"&gt;Example code Gist used for tutorial: bulk files rename shell script for Linux&lt;/a&gt;&lt;/p&gt;

</description>
      <category>shell</category>
      <category>script</category>
    </item>
    <item>
      <title>Run PHP hello world web application in one minute</title>
      <dc:creator>Taras Shkodenko</dc:creator>
      <pubDate>Sat, 01 Jul 2023 15:02:05 +0000</pubDate>
      <link>https://dev.to/podlom/run-php-hello-world-web-application-in-one-minute-14k3</link>
      <guid>https://dev.to/podlom/run-php-hello-world-web-application-in-one-minute-14k3</guid>
      <description>&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=beFItCAE4pI"&gt;Watch this one minute tutorial on YouTube&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
      <category>php</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
