<?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: Oleksiy Rudenko</title>
    <description>The latest articles on DEV Community by Oleksiy Rudenko (@oleksiyrudenko).</description>
    <link>https://dev.to/oleksiyrudenko</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%2F111399%2F0516d083-1e84-4159-a006-4659963081dd.jpeg</url>
      <title>DEV Community: Oleksiy Rudenko</title>
      <link>https://dev.to/oleksiyrudenko</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/oleksiyrudenko"/>
    <language>en</language>
    <item>
      <title>An intro to contributing to a 3rd party repo for beginners</title>
      <dc:creator>Oleksiy Rudenko</dc:creator>
      <pubDate>Thu, 22 Nov 2018 15:00:09 +0000</pubDate>
      <link>https://dev.to/oleksiyrudenko/an-intro-to-contributing-to-a-3rd-party-repo-for-beginners-3pe3</link>
      <guid>https://dev.to/oleksiyrudenko/an-intro-to-contributing-to-a-3rd-party-repo-for-beginners-3pe3</guid>
      <description>&lt;p&gt;An opinionated and probably oversimplified guidelines. Please, feel free challenging in comments.&lt;/p&gt;

&lt;p&gt;You will find visualized what's this article is above in &lt;a href="https://docs.google.com/presentation/d/13dati5gvA5f_hQFgxJPhPicjF5CRKu1e75RSsahmEaU" rel="noopener noreferrer"&gt;Google Slides&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pre-requisites
&lt;/h2&gt;

&lt;p&gt;You know and use basic git commands like &lt;code&gt;init&lt;/code&gt;, &lt;code&gt;clone&lt;/code&gt;, &lt;code&gt;add&lt;/code&gt;, &lt;code&gt;commit&lt;/code&gt;, &lt;code&gt;branch&lt;/code&gt;, &lt;code&gt;checkout&lt;/code&gt;, &lt;code&gt;merge&lt;/code&gt;, &lt;code&gt;pull&lt;/code&gt;, &lt;code&gt;push&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You probably know and use git commands like &lt;code&gt;fetch&lt;/code&gt;, &lt;code&gt;pull --rebase&lt;/code&gt;, &lt;code&gt;rebase&lt;/code&gt;, &lt;code&gt;cherry-pick&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You want to contribute to a repo you do not have write access to.&lt;/p&gt;

&lt;p&gt;You do not know how to or do not feel confident working with repos you do not have write access to.&lt;/p&gt;

&lt;p&gt;You do not follow any firm workflow working with your own repos or repos you do not have write access to.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you will learn
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;How to keep your fork in sync with a source repo&lt;/li&gt;
&lt;li&gt;How to minimize risks of conflicts&lt;/li&gt;
&lt;li&gt;How to keep your repo history tree as clean as possible&lt;/li&gt;
&lt;li&gt;How to contribute properly via pull requests&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A good workflow to start with
&lt;/h2&gt;

&lt;p&gt;Some definitions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;upstream&lt;/strong&gt; is a repo you want to contribute to&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;origin&lt;/strong&gt; or &lt;strong&gt;fork&lt;/strong&gt; is your own fork of an upstream&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;local&lt;/strong&gt; is a local clone of origin&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Initialize things
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Fork an upstream. 
On GitHub navigate to the upstream and click &lt;strong&gt;Fork&lt;/strong&gt; button.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git clone origin-url.git target-directory&lt;/code&gt; on your machine to clone your fork&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd target-directory&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git remote add upstream-url.git&lt;/code&gt; to enable upstream-related actions&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Add your changes
&lt;/h3&gt;

&lt;p&gt;It is important to have your fork in sync with upstream, employ branches and follow certain workflow to minimize conflicts risks and keep the history tree as clean as possible.&lt;/p&gt;

&lt;h4&gt;
  
  
  Initialize a feature branch
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;sync local and origin with upstream
&lt;code&gt;git checkout master &amp;amp;&amp;amp; git pull upstream master &amp;amp;&amp;amp; git push origin master&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;create a feature branch with a meaningful name
&lt;code&gt;git checkout -b feature-branch&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;There are many branch naming conventions. Few to mention are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;start with author initials so other collaborators know who
initialized the branch and also find branches per author, e.g. &lt;code&gt;or-feature-portview&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;use slashes to denominate scopes, e.g. &lt;code&gt;feature/api/rest&lt;/code&gt;, &lt;code&gt;bugfix/sleep&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;use ticket/issue/epic/story id, e.g. &lt;code&gt;feat/epic123/story128/search-people&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Useful alias:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git config --global alias.sync-master '!git checkout master &amp;amp;&amp;amp; git pull upstream master &amp;amp;&amp;amp; git push origin master'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Usage: &lt;code&gt;git sync-master&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Feature development cycle
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;do whatever you want&lt;/li&gt;
&lt;li&gt;commit often: &lt;code&gt;git add . &amp;amp;&amp;amp; git commit -m "Add REST api PATCH method"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;squash eventually grouping commits as appropriate:
&lt;code&gt;git rebase -i &amp;lt;REF&amp;gt;&lt;/code&gt;
(&lt;a href="https://gist.github.com/OleksiyRudenko/232e1ebe6ed0780fc69d7391723cc75b" rel="noopener noreferrer"&gt;Making use of git rebase&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;sync eventually local, origin, and feature branch with upstream

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git checkout master &amp;amp;&amp;amp; git pull upstream master &amp;amp;&amp;amp; git push origin master&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git checkout - &amp;amp;&amp;amp; git merge master&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;resolve conflicts using your IDE or command line&lt;/li&gt;
&lt;li&gt;when done &lt;code&gt;git add . &amp;amp;&amp;amp; gir commit -m "Resolved merge conflict by incorporating both suggestions"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;see also 
&lt;a href="https://help.github.com/articles/resolving-a-merge-conflict-using-the-command-line/" rel="noopener noreferrer"&gt;Resolving a merge conflict using the command line&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;go to &lt;code&gt;#1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;eventually push to origin: &lt;code&gt;git push origin feature-branch&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Useful alias:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git config --global alias.sync-branch '!git sync-master &amp;amp;&amp;amp; git checkout - &amp;amp;&amp;amp; git merge master'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Usage: &lt;code&gt;git sync-branch&lt;/code&gt; (it also does &lt;code&gt;sync-master&lt;/code&gt; as a part of the flow)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Commit message&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There are numbers of commit message structure conventions.&lt;br&gt;
To mention a few:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;start with commit scope, e.g. one of &lt;code&gt;feat|fix|docs|style|refactor|test|chore&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;add feature/fix scope, e.g. &lt;code&gt;(api)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;use imperative mood in the subject line, e.g. one of &lt;code&gt;Add|Change|Fix|Refactor|Remove|Bump version|Release version&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you resolve an issue (in upstream or fork) it is useful to have a note on issue resolution.&lt;/p&gt;

&lt;p&gt;Your commit message may look like the following&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fix(foo api): Fix ABC component render conditions

Resolves: #12
See also: #34, #78
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Further reading:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.conventionalcommits.org/en/v1.0.0-beta.2/" rel="noopener noreferrer"&gt;Conventional Commits 1.0.0-beta.2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chris.beams.io/posts/git-commit/" rel="noopener noreferrer"&gt;How to Write a Git Commit Message&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://robots.thoughtbot.com/5-useful-tips-for-a-better-commit-message" rel="noopener noreferrer"&gt;5 Useful Tips For A Better Commit Message&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/semantic-release/semantic-release" rel="noopener noreferrer"&gt;Semantic release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/search?q=writing+a+good+commit+message" rel="noopener noreferrer"&gt;even more...&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;DON'Ts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Do not squash or rebase what is already on remotes!&lt;/p&gt;

&lt;p&gt;Do not overwrite hsitory on remotes!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NB&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The above doesn't cover the case when you work on the same branch with someone else, when you will prefer &lt;code&gt;git pull --rebase&lt;/code&gt; over &lt;code&gt;git pull&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Contribute via pull request
&lt;/h3&gt;

&lt;p&gt;Contributing is not necessarily required. You may develop your fork for your own purposes (adhering to upstream license conditions).&lt;/p&gt;

&lt;p&gt;Otherwise stick to the following contribution workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;git push origin feature-branch&lt;/code&gt; to push your feature branch to the origin.&lt;/li&gt;
&lt;li&gt;Navigate to the cloud git hub (e.g. GitHub)&lt;/li&gt;
&lt;li&gt;Use cloud UI to create the PR&lt;/li&gt;
&lt;li&gt;Pass through code review process until your changes are merged or declined&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once your feature branch gets merged you will find your commits in upon next sync with upstream. So, you don't need merging those to your &lt;code&gt;master&lt;/code&gt; locally.&lt;/p&gt;

&lt;p&gt;However, you will need to merge into &lt;code&gt;master&lt;/code&gt; if you do not contribute to the upstream or your PR is declined and you want to keep those for yourself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cleaning up
&lt;/h3&gt;

&lt;p&gt;Once your PR approved and merged you can get rid off your feature branch.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git branch -D feature-branch&lt;/code&gt;&lt;/p&gt;




&lt;p&gt;Feel free forking the &lt;a href="https://gist.github.com/OleksiyRudenko/236c3046fbba028e0555fa847dae7001" rel="noopener noreferrer"&gt;source gist&lt;/a&gt; and editing it so it fits your particular needs (e.g. remove parts that you already know well).&lt;/p&gt;

</description>
      <category>git</category>
      <category>opensource</category>
      <category>beginners</category>
      <category>contribution</category>
    </item>
    <item>
      <title>Please, do not pollute project's .gitignore</title>
      <dc:creator>Oleksiy Rudenko</dc:creator>
      <pubDate>Thu, 08 Nov 2018 20:08:46 +0000</pubDate>
      <link>https://dev.to/oleksiyrudenko/please-do-not-pollute-projects-gitignore-3h8e</link>
      <guid>https://dev.to/oleksiyrudenko/please-do-not-pollute-projects-gitignore-3h8e</guid>
      <description>&lt;p&gt;&lt;code&gt;.gitignore&lt;/code&gt; is a rule-set defining resources we do not want to be git tracked, or putting it other way be ignored by git.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Spoiler alert.&lt;/strong&gt; If you know what is &lt;code&gt;~/.gitignore&lt;/code&gt; about, you don't need to read any further.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There are 3 most common major groups of resources that we do not want or just do not need to track with git:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;sources compiled/transpiled into intermediary code files (e.g. &lt;code&gt;.obj&lt;/code&gt; or &lt;code&gt;.o&lt;/code&gt; in C/C++ universe), distribution packages, other deliverables, logs etc. whatever derives from tracked source code.&lt;/li&gt;
&lt;li&gt;dev environment temporary files and/or e.g. IDE settings specific to the project (yet very specific to a particular IDE)&lt;/li&gt;
&lt;li&gt;scratches, notes, clipboards etc.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You don't need to track derivatives from item 1 since you can build deliverables at any time from sources and having those under VCS control is senseless. So these exclusions are pretty helpful and every project contributor would benefit from having them listed in project's &lt;code&gt;.gitignore&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Next you will add your favourite IDE temps to &lt;code&gt;.gitignore&lt;/code&gt;, your colleagues will add theirs, and someone else may wonder one day if &lt;code&gt;.DS_store/&lt;/code&gt; is anything to do with project's database or why idea sharing is not encouraged on the project (&lt;code&gt;.idea/&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Project contributors may also agree on that scratches and notes are stored under &lt;code&gt;tmp/&lt;/code&gt; and should not be shared via git remote.&lt;/p&gt;

&lt;p&gt;OK.&lt;/p&gt;

&lt;p&gt;There are many collections and helpful resources that would assist you in compiling a &lt;code&gt;.gitignore&lt;/code&gt; that covers your technology stack (item 1), most common IDEs (item 2), and also smth like &lt;code&gt;tmp/&lt;/code&gt; to cover item 3.&lt;/p&gt;

&lt;p&gt;To name a few:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/github/gitignore" rel="noopener noreferrer"&gt;https://github.com/github/gitignore&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.gitignore.io/" rel="noopener noreferrer"&gt;https://www.gitignore.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/CodeZombieCH/vscode-gitignore" rel="noopener noreferrer"&gt;https://github.com/CodeZombieCH/vscode-gitignore&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/gitignorer" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/gitignorer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But why do you want to have even a hint of anything not related to the project in your project files? IDEs come and go. Personal notes? Too personal.&lt;/p&gt;

&lt;p&gt;Project &lt;code&gt;.gitignore&lt;/code&gt; becomes polluted. Rules to cover item 1 are OK as those &lt;strong&gt;bring&lt;/strong&gt; value to the project contribution team.&lt;/p&gt;

&lt;p&gt;Imagine (really easy do) you contribute to an open source project where &lt;code&gt;.gitignore&lt;/code&gt; doesn't list your fav IDE exclusion rule. There are two options to resolve the situation:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add a rule to exclude your favourite yet not hypy IDE to project's &lt;code&gt;.gitignore&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Do something like &lt;code&gt;git add -A &amp;amp;&amp;amp; git reset -- MyLovelyIDE/*&lt;/code&gt; at every commit&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both are neither good, nor convenient.&lt;/p&gt;

&lt;p&gt;There is a proper place to keep your individual preferences out of git track and not confusing your project mates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Global &lt;code&gt;.gitignore&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a &lt;code&gt;.gitignore&lt;/code&gt; file in your home directory &lt;code&gt;~/&lt;/code&gt; (&lt;code&gt;C:\Users\your-user-name\&lt;/code&gt; under Windows).&lt;/li&gt;
&lt;li&gt;Populate it with exclusion rules you would have in any project (dev environment and IDE settings, subdirectories for notes and scratches etc.)&lt;/li&gt;
&lt;li&gt;run &lt;code&gt;git config --global core.excludesfile ~/.gitignore&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You are done! Share your discovery with colleagues.&lt;/p&gt;




&lt;p&gt;Cover image credits: &lt;a href="https://timbercode.pl/blog/2017/02/19/gitignore-2-sztuczki/" rel="noopener noreferrer"&gt;timbercode.pl&lt;/a&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>versioncontrol</category>
    </item>
    <item>
      <title>Git backed package management</title>
      <dc:creator>Oleksiy Rudenko</dc:creator>
      <pubDate>Wed, 31 Oct 2018 13:06:12 +0000</pubDate>
      <link>https://dev.to/oleksiyrudenko/git-backed-package-management-c81</link>
      <guid>https://dev.to/oleksiyrudenko/git-backed-package-management-c81</guid>
      <description>

&lt;p&gt;As a developer I want to keep my code base &lt;a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself"&gt;DRY&lt;/a&gt; and also DRO&lt;sup&gt;1&lt;/sup&gt; as much as only possible. To achieve that I want to be able to&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;import a 3rd-party package&lt;/li&gt;
&lt;li&gt;update imported package from its source&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are package and dependency managers that come to rescue. &lt;a href="https://www.npmjs.com/"&gt;&lt;strong&gt;npm&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://yarnpkg.com/en/"&gt;&lt;strong&gt;yarn&lt;/strong&gt;&lt;/a&gt; in JavaScript Universe, and &lt;a href="https://getcomposer.org/"&gt;&lt;strong&gt;Composer&lt;/strong&gt;&lt;/a&gt; often attributed to PHP World to name a few.&lt;/p&gt;

&lt;p&gt;But what if your technology stack ecosystem doesn't offer any (&lt;em&gt;BTW, did you know you can effectively use either of the above in virtually any ecosystem?&lt;/em&gt;) or only tools you can (or may) employ are Ctrl-C/Ctrl-V&lt;sup&gt;2&lt;/sup&gt; and/or git?&lt;/p&gt;

&lt;p&gt;Copy-pasting is the latest resort. Let's stick to git.&lt;/p&gt;

&lt;p&gt;Many employ the following git-based tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/book/en/v2/Git-Tools-Submodules"&gt;git-submodule&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mirrors.edge.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html"&gt;git subtree merge strategy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/git/git/blob/master/contrib/subtree/git-subtree.txt"&gt;git-subtree&lt;/a&gt; (comes bundled with git since release 1.7.11)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.gelato.unsw.edu.au/archives/git/0506/5511.html"&gt;The coolest merge EVER!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Well, the above works. But recently I found a tool that not only removes hassle but also allows to push changes to imported packages back to source (consider pull-request mechanism though).&lt;/p&gt;

&lt;p&gt;Here is the hero of the day!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ingydotnet/git-subrepo"&gt;git-subrepo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basic workflow is as simple as&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# init
git subrepo clone anotherRepo.git localSubdir4anotherRepo -b master
# update from anotherRepo
git subrepo pull localSubdir4anotherRepo
# export back
git subrepo push localSubdir4anotherRepo -b anotherRepo-target-branch

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;I just love it.&lt;/p&gt;

&lt;p&gt;More details and further reading on the topic available in &lt;a href="https://gist.github.com/OleksiyRudenko/86d378b56fe690e47a066b8eeb4ac5b2"&gt;Repo import and export back&lt;/a&gt; gist.&lt;/p&gt;




&lt;p&gt;&lt;sup&gt;(1)&lt;/sup&gt; - Don't Repeat Others; arguable but IMO perfectly fits the context here.&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;(2)&lt;/sup&gt; - or equivalent supporting content copy-pasting.&lt;/p&gt;


</description>
      <category>git</category>
      <category>productivity</category>
      <category>programming</category>
      <category>packagemanagement</category>
    </item>
  </channel>
</rss>
