<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:og="http://ogp.me/ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:schema="http://schema.org/" xmlns:sioc="http://rdfs.org/sioc/ns#" xmlns:sioct="http://rdfs.org/sioc/types#" xmlns:skos="http://www.w3.org/2004/02/skos/core#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" version="2.0" xml:base="https://www.linuxjournal.com/">
  <channel>
    <title>git</title>
    <link>https://www.linuxjournal.com/</link>
    <description/>
    <language>en</language>
    
    <item>
  <title>Documenting Proper Git Usage</title>
  <link>https://www.linuxjournal.com/content/documenting-proper-git-usage</link>
  <description>  &lt;div data-history-node-id="1340753" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/zack-brown" lang="" about="https://www.linuxjournal.com/users/zack-brown" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;Zack Brown&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;
&lt;strong&gt;Jonathan Corbet&lt;/strong&gt; wrote a document for inclusion in the kernel tree, describing
best practices for merging and rebasing &lt;strong&gt;git&lt;/strong&gt;-based kernel repositories. As he put
it, it represented workflows that were actually in current use, and it was a living
document that hopefully would be added to and corrected over time.
&lt;/p&gt;

&lt;p&gt;
The inspiration for the document came from noticing how frequently &lt;strong&gt;Linus
Torvalds&lt;/strong&gt;
was unhappy with how other people—typically subsystem maintainers—handled
their git trees.
&lt;/p&gt;

&lt;p&gt;
It's interesting to note that before Linus wrote the git tool, branching and
merging was virtually unheard of in the Open Source world. In &lt;strong&gt;CVS&lt;/strong&gt;, it was a
nightmare horror of leechcraft and broken magic. Other tools were not much better.
One of the primary motivations behind git—aside from blazing speed—was, in
fact, to make branching and merging trivial operations—and so they have become.
&lt;/p&gt;

&lt;p&gt;
One of the offshoots of branching and merging, Jonathan wrote, was rebasing—altering the patch history of a local repository. The benefits of rebasing are
fantastic. They can make a repository history cleaner and clearer, which in turn
can make it easier to track down the patches that introduced a given bug. So
rebasing has a direct value to the development process.
&lt;/p&gt;

&lt;p&gt;
On the other hand, used poorly, rebasing can make a big mess. For example, suppose
you rebase a repository that has already been merged with another, and then merge
them again—insane soul death.
&lt;/p&gt;

&lt;p&gt;
So Jonathan explained some good rules of thumb. Never rebase a repository that's
already been shared. Never rebase patches that come from someone else's repository.
And in general, simply never rebase—unless there's a genuine reason.
&lt;/p&gt;

&lt;p&gt;
Since rebasing changes the history of patches, it relies on a new "base" version,
from which the later patches diverge. Jonathan recommended choosing a base version
that was generally thought to be more stable rather than less—a new version or a
release candidate, for example, rather than just an arbitrary patch during regular
development.
&lt;/p&gt;

&lt;p&gt;
Jonathan also recommended, for any rebase, treating all the rebased patches as new
code, and testing them thoroughly, even if they had been tested already prior to
the rebase.
&lt;/p&gt;

&lt;p&gt;
"If", he said, "rebasing is limited to private trees, commits are based on a
well-known starting point, and they are well tested, the potential for trouble is
low."
&lt;/p&gt;

&lt;p&gt;
Moving on to merging, Jonathan pointed out that nearly 9% of all kernel commits
were merges. There were more than 1,000 merge requests in the 5.1 development cycle
alone.
&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/documenting-proper-git-usage" hreflang="en"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Wed, 07 Aug 2019 22:30:00 +0000</pubDate>
    <dc:creator>Zack Brown</dc:creator>
    <guid isPermaLink="false">1340753 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Signing Git Commits</title>
  <link>https://www.linuxjournal.com/content/signing-git-commits</link>
  <description>  &lt;div data-history-node-id="1340585" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/kyle-rankin" lang="" about="https://www.linuxjournal.com/users/kyle-rankin" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;Kyle Rankin&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;&lt;em&gt;Protect your code commits from malicious changes by GPG-signing them.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;
Often when people talk about GPG, they focus on encryption—GPG's ability to
protect a file or message so that only someone who has the appropriate
private key can read it. Yet, one of the most important functions GPG offers
is &lt;em&gt;signing&lt;/em&gt;. Where encryption protects a file or message so that only the
intended recipient can decrypt and read it, GPG signing proves that the
message was sent by the sender (whomever has control over the private key used
to sign) and has not been altered in any way from what the sender wrote.
&lt;/p&gt;

&lt;p&gt;
Without GPG signing, you could receive encrypted email that only you could
open, but you wouldn't be able to prove that it was from the sender. But,
GPG signing has applications far beyond email. If you use a modern Linux
distribution, it uses GPG signatures on all of its packages, so you can be
sure that any software you install from the distribution hasn't been altered
to add malicious code after it was packaged. Some distributions even GPG-sign
their ISO install files as a stronger form of MD5sum or SHA256sum to verify
not only that the large ISO downloaded correctly (MD5 or SHA256 can do that),
but also that the particular ISO you are downloading from some random mirror
is the &lt;em&gt;same&lt;/em&gt; ISO that the distribution created. A mirror could change the
file and generate new MD5sums, and you may not notice, but it couldn't
generate valid GPG signatures, as that would require access to the
distribution's signing key.
&lt;/p&gt;

&lt;span class="h3-replacement"&gt;
Why Sign Git Commits&lt;/span&gt;

&lt;p&gt;
As useful as signing packages and ISOs is, an even more important use of GPG
signing is in signing Git commits. When you sign a Git commit, you can prove
that the code you submitted came from you and wasn't altered while you were
transferring it. You also can prove that you submitted the code and not
someone else.
&lt;/p&gt;

&lt;p&gt;
Being able to prove who wrote a snippet of code isn't so you know who to
blame for bugs so the person can't squirm out of it. Signing Git commits is
important because in this age of malicious code and back doors, it helps
protect you from an attacker who might otherwise inject malicious code into
your codebase. It also helps discourage untrustworthy developers from
adding their own back doors to the code, because once it's discovered, the bad
code will be traced to them.
&lt;/p&gt;

&lt;span class="h3-replacement"&gt;
How to Sign Git Commits&lt;/span&gt;

&lt;p&gt;
The simplest way to sign Git commits is by adding the &lt;code&gt;-S&lt;/code&gt; option
to the &lt;code&gt;git
commit&lt;/code&gt; command. First, figure out your GPG key ID with:

&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/signing-git-commits" hreflang="en"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Thu, 16 May 2019 12:00:00 +0000</pubDate>
    <dc:creator>Kyle Rankin</dc:creator>
    <guid isPermaLink="false">1340585 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Take Your Git In-House</title>
  <link>https://www.linuxjournal.com/content/take-your-git-house</link>
  <description>  &lt;div data-history-node-id="1339954" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/john-s-tonello" lang="" about="https://www.linuxjournal.com/users/john-s-tonello" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;John S. Tonello&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;&lt;em&gt;If you're wary of the Microsoft takeover of GitHub, or if you've been
looking for a way to ween yourself off free public repositories, or if you want
to ramp up your DevOps efforts, now's a good time to look at installing
and running GitLab yourself. It's not as difficult as you might think,
and the free, open-source GitLab CE version provides a lot of flexibility to
start from scratch, migrate or graduate to more full-fledged versions.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;
In today's software business, getting solid code out the door fast is a
must, and practices to make that easier are part of any organization's
DevOps toolset. Git has risen to the top of the heap of version control
tools, because it's simple, fast and makes collaboration easy.
&lt;/p&gt;

&lt;p&gt;
For developers, tools like Git ensure that their code isn't just
backed up and made available to others, but nearly guarantees that it can be
incorporated into a wide variety of third-party development tools—from
Jenkins to Visual Studio—that make continuous integration and
continuous delivery (CI/CD) possible. Orchestration, automation and
deployment tools easily integrate with Git as well, which means code developed
on any laptop or workstation anywhere can be merged, branched and integrated
into deployed software. That's why version control repositories are the
future of software development and DevOps, no matter how big or small you
are, and no matter whether you're building monolithic apps or
containerized ones.
&lt;/p&gt;

&lt;span class="h3-replacement"&gt;
Getting Started with Git&lt;/span&gt;

&lt;p&gt;
Git works by taking snapshots of code on every commit, so every version of
contributed code is always available. That means it's easy to roll back
changes or look over different contributors' work.
&lt;/p&gt;

&lt;p&gt;
If you're working in an environment that uses Git, you can do your work
even when you're offline. Everything is saved in a project structure on
your workstation, just as it is in the remote Git repository, and when
you're next online, your commits and pushes update the master (or other)
code branch quickly and easily.
&lt;/p&gt;

&lt;p&gt;
Most Git users (even newbies) use the Git command-line tools to clone, commit
and push changes, because it's easy, and for nearly 28-million developers,
GitHub has become the de facto remote Git-based repository for their work. In
fact, GitHub has moved beyond being just a code repository to become a
multifaceted code community featuring 85-million projects. That's a lot
of code.
&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/take-your-git-house" hreflang="en"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Thu, 27 Sep 2018 12:56:39 +0000</pubDate>
    <dc:creator>John S. Tonello</dc:creator>
    <guid isPermaLink="false">1339954 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Git Quick Start Guide</title>
  <link>https://www.linuxjournal.com/content/git-quick-start-guide</link>
  <description>  &lt;div data-history-node-id="1339969" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/patrick-whelan" lang="" about="https://www.linuxjournal.com/users/patrick-whelan" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;Patrick Whelan&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;&lt;em&gt;Ditch USBs and start using real version control, and if you follow this guide,
you can start using git in 30 minutes!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;
If you have any experience with programming or just altering config
files, I'm sure you've been dumbstruck by how one change you've made along
the line affects the whole project. Identifying and isolating the problem
without a version control system is often time- and energy-intensive,
involving retracing your steps and checking all changes made before the
unwanted behavior first occurred. A version control system is designed
explicitly to make that process easier and provide readable comparisons between
versions of text.
&lt;/p&gt;

&lt;p&gt;
Another great feature that distributed version control systems
such as git provide is the power of lateral movement. Traditionally, a team of
programmers would implement features linearly. This meant pulling the code
from the trusted source (server) and developing a section before pushing
the altered version back upstream to the server. With distributed systems,
every computer maintains a full repository, which means each programmer
has a full history of additions, deletions and contributors as well as the
ability to roll back to a previous version or break away from the trusted
repository and fork the development tree (which I discuss later).
&lt;/p&gt;

&lt;span class="h3-replacement"&gt;
Quick Start Guide&lt;/span&gt;

&lt;p&gt;
The great thing about git is there's so little you need to know! Without further ado, let's begin with the most important commands.
&lt;/p&gt;

&lt;p&gt;
First, I'm working with a previous project of mine located here:

&lt;/p&gt;&lt;pre&gt;
&lt;code&gt;
[user@lj src]$ pwd
/home/lj/projects/java/spaceInvaders/src
&lt;/code&gt;
&lt;/pre&gt;


&lt;p&gt;
To create a local repository, simply run:

&lt;/p&gt;&lt;pre&gt;
&lt;code&gt;
[user@lj src]$ git init
Initialized empty Git repository in
 ↪/home/lj/projects/java/spaceInvaders/src/.git/
&lt;/code&gt;
&lt;/pre&gt;


&lt;p&gt;
To add all source files recursively to git's index, run:

&lt;/p&gt;&lt;pre&gt;
&lt;code&gt;
[user@lj src]$ git add .
&lt;/code&gt;
&lt;/pre&gt;


&lt;p&gt;
To push these indexed files to the local repository, run:

&lt;/p&gt;&lt;pre&gt;
&lt;code&gt;
[user@lj src]$ git commit
&lt;/code&gt;
&lt;/pre&gt;


&lt;p&gt;
You'll see a screen containing information about the commit, which allows you to leave a description of the commit:

&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/git-quick-start-guide" hreflang="en"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Tue, 14 Aug 2018 12:00:00 +0000</pubDate>
    <dc:creator>Patrick Whelan</dc:creator>
    <guid isPermaLink="false">1339969 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>A Git Origin Story</title>
  <link>https://www.linuxjournal.com/content/git-origin-story</link>
  <description>  &lt;div data-history-node-id="1339955" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/zack-brown" lang="" about="https://www.linuxjournal.com/users/zack-brown" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;Zack Brown&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;&lt;em&gt;A look at Linux kernel developers' various
revision control solutions through the years, Linus Torvalds' decision to use
BitKeeper and the controversy that followed, and how Git came to be created.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;
Originally, Linus Torvalds used no revision control at all. Kernel
contributors would post their patches to the Usenet group, and later to the
mailing list, and Linus would apply them to his own source tree. Eventually,
Linus would put out a new release of the whole tree, with no division between any of
the patches. The only way to examine the history of his process was as a
giant &lt;code&gt;diff&lt;/code&gt; between two full releases.
&lt;/p&gt;

&lt;p&gt;
This was not because there were no open-source revision control systems
available. CVS had been around since the 1980s, and it was still the most
popular system around. At its core, it would allow contributors to submit
patches to a central repository and examine the history of patches going
into that repository.
&lt;/p&gt;

&lt;p&gt;
There were many complaints about CVS though. One was that it tracked changes on a
per-file basis and didn't recognize a larger patch as a single revision,
which made it hard to interpret the past contributions of other developers.
There also were some hard-to-fix bugs, like race conditions when two
conflicting patches were submitted at the same time.
&lt;/p&gt;

&lt;p&gt;
Linus didn't like CVS, partly for the same reasons voiced by others and
partly for his own reasons that would become clear only later. He
also didn't like Subversion, an open-source project that emerged around the start of the
2000s and had the specific goal of addressing the bugs and misfeatures in
CVS.
&lt;/p&gt;

&lt;p&gt;
Many Linux kernel developers were unhappy with the lack of proper revision
control, so there always was a certain amount of community pressure for Linus
to choose something from one of the available options. Then, in 2002, he did.
To everyone's shock and dismay, Linus chose BitKeeper, a closed-source
commercial system developed by the BitMover company, run by Larry McVoy.
&lt;/p&gt;

&lt;p&gt;
The Linux kernel was the most important open-source project in history, and
Linus himself was the person who first discovered the techniques of open-source development that had eluded the GNU project, and that would be
imitated by open-source projects for decades to come, right up to the present
day. What was Linus thinking? How could he betray his community and the Open
Source world like this? Those were the thoughts of many when Linus first
started using BitKeeper for kernel development.
&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/git-origin-story" hreflang="en"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Fri, 27 Jul 2018 11:45:00 +0000</pubDate>
    <dc:creator>Zack Brown</dc:creator>
    <guid isPermaLink="false">1339955 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Building a Bare-Bones Git Environment</title>
  <link>https://www.linuxjournal.com/content/building-bare-bones-git-environment</link>
  <description>  &lt;div data-history-node-id="1339959" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/andy-carlson" lang="" about="https://www.linuxjournal.com/users/andy-carlson" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;Andy Carlson&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;&lt;em&gt;How to migrate repositories from GitHub, configure the software and get
started with hosting Git repositories on your own Linux server.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;
With the recent news of Microsoft's acquisition of GitHub, many people have
chosen
to research other code-hosting options. Self-hosted solutions like GitLabs
offer a polished UI, similar in functionality to GitHub but one that requires
reasonably well-powered hardware and provides many features that casual
Git users won't necessarily find useful.
&lt;/p&gt;

&lt;p&gt;
For those who want a simpler solution, it's
possible to host Git repositories locally on a Linux server using a few basic
pieces of software that require minimal system resources and provide basic
Git functionality including web accessibility and HTTP/SSH cloning.
&lt;/p&gt;

&lt;p&gt;
In this
article, I show how to migrate repositories from GitHub, configure the
necessary software and perform some basic operations.
&lt;/p&gt;

&lt;span class="h3-replacement"&gt;
Migrating Repositories&lt;/span&gt;

&lt;p&gt;
The first step in migrating away from GitHub is to relocate your repositories
to the server where they'll be hosted. Since Git is a distributed version
control system, a cloned copy of a repository contains all information
necessary for running the entire repository. As such, the repositories can
be cloned from GitHub to your server, and all the repository data, including
commit logs, will be retained. If you have a large number of repositories
this could be a time-consuming process. To ease this process, here's a bash
function to return the URLs for all repositories hosted by a specific GitHub
user:

&lt;/p&gt;&lt;pre&gt;
&lt;code&gt;
genrepos() {
    if [ -z "$1" ]; then
        echo "usage: genrepos &lt;github username&gt;"
    else
        repourl="https://github.com/$1?tab=repositories"
        while [ -n "$repourl" ]; do
            curl -s "$repourl" | awk '/href.*codeRepository/
 ↪{print gensub(/^.*href="\/(.*)\/(.*)".*$/,
↪"https://github.com/\\1/\\2.git","g",$0); }'
            export repourl=$(curl -s "$repourl" | grep'&gt;Previous&lt;.
↪*href.*&gt;Next&lt;' | grep -v 'disabled"&gt;Next' | sed
↪'s/^.*href="//g;s/".*$//g;s/^/https:\/\/github.com/g')
        done
    fi
}
&lt;/code&gt;
&lt;/pre&gt;


&lt;p&gt;
This function accepts a single argument of the GitHub user name. If the
output of this command is piped into a &lt;code&gt;while&lt;/code&gt; loop to read each
line, each line
can be fed into a &lt;code&gt;git clone&lt;/code&gt; statement. The repositories will be
cloned into the /opt/repos directory:

&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/building-bare-bones-git-environment" hreflang="en"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Tue, 24 Jul 2018 12:00:00 +0000</pubDate>
    <dc:creator>Andy Carlson</dc:creator>
    <guid isPermaLink="false">1339959 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Opinion: GitHub vs GitLab</title>
  <link>https://www.linuxjournal.com/content/opinion-github-vs-gitlab</link>
  <description>  &lt;div data-history-node-id="1339943" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/matt-lee" lang="" about="https://www.linuxjournal.com/users/matt-lee" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;Matt Lee&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;&lt;em&gt;Free software deserves free tools, not Microsoft-owned GitHub.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;
So, Microsoft bought GitHub, and many people are confused or
worried. It's not a new phenomenon when any large company buys any
smaller company, and people are right to be worried, although I argue
that their timing is wrong. Like Microsoft, GitHub has made some
useful contributions to free and open-source software, but let's not
forget that GitHub's main product is proprietary software. And, it's not
just some innocuous web service either; GitHub makes and sells a
proprietary software package you can download and run on your own
server called GitHub Enterprise (GHE).
&lt;/p&gt;

&lt;p&gt;
Let's remember how we got here. BitMover made a tool called BitKeeper,
a proprietary version control system that allowed free-of-charge
licenses to free software projects. In 2002, the Linux kernel switched
to using BitKeeper for its version control, although some notable
developers made the noble choice to refuse to use the proprietary
program. Many others did not, and for a number of years, kernel development
was hampered by BitKeeper's restrictive noncommercial licenses.
&lt;/p&gt;

&lt;p&gt;
In 2005, Andrew Tridgell, working at OSDL, developed a client
that bypassed this restriction, and as a result, BitMover removed
licenses to BitKeeper from all OSDL employees—including Linus
Torvalds. Eventually, all non-commercial licenses were stopped, and new
licenses included clauses preventing the development of alternative
version control systems. As a result of this, two new projects were
born: Mercurial and Git. Created in a few short weeks in 2005, Git
quickly became the version control system for Linux development.
&lt;/p&gt;

&lt;p&gt;
Proprietary version control tools aren't common in free software
development, but proprietary collaboration websites have been around
for some time. One of the earliest collaboration websites still around
today is Sourceforge. Sourceforge was created in the late 1990s by VA
Software, and the code behind the project was released in
2000.
&lt;/p&gt;

&lt;p&gt;
Quickly this situation changed, and &lt;a href="http://fsfe.org/news/2001/article2001-10-20-01.en.html"&gt;the project was shuttered
and then became Sourceforge Enterprise
Edition&lt;/a&gt;, a
proprietary software package. The code that ran Sourceforge was forked
into GNU Savannah (later Savane) and GForge, and it's still use today by
both the GNU Project and CERN. When &lt;a href="https://www.fsf.org/blogs/community/savannah"&gt;I last wrote about this
problem&lt;/a&gt;, almost exactly
ten years ago, Canonical's ambitious Launchpad service still
was proprietary, something later remedied in 2009. Gitorious was created
in 2010 and was for a number of years the Git hosting platform for the
discerning free software developer, as the code for Gitorious was
fully public and licensed under favorable terms for the new wave of
AGPL-licensed projects that followed the FSF's Franklin Street
Statement. Gitorious, also, is sadly no longer with us.
&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/opinion-github-vs-gitlab" hreflang="en"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Mon, 16 Jul 2018 11:30:00 +0000</pubDate>
    <dc:creator>Matt Lee</dc:creator>
    <guid isPermaLink="false">1339943 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Git Your July 2018 Issue of Linux Journal: Now Available</title>
  <link>https://www.linuxjournal.com/content/git-your-july-2018-issue-linux-journal-now-available</link>
  <description>  &lt;div data-history-node-id="1339995" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/carlie-fairchild" lang="" about="https://www.linuxjournal.com/users/carlie-fairchild" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;Carlie Fairchild&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;Along with Microsoft buying Github recently, we received hundreds of questions and comments about all things git. How does one install and run GitLab themselves? Should they? What's the difference between GitHub and GitLab? How can one migrate repositories from GitHub and host on their own Linux server? So with this July issue of&lt;em&gt; Linux Journal&lt;/em&gt;, we take a Deep Dive in to... git. Enjoy!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feature articles include:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A Git Origin Story by Zack Brown&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;A look at the Linux kernel developers' various revision control solutions through the years, Linus Torvalds' decision to use BitKeeper and the controversy that followed, and how Git came to be created.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Git Quick Start Guide by Patrick Whelan&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Ditch USBs and start using real version control, and if you follow this guide, you can start using git in 30 minutes!&lt;em&gt;&lt;/em&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Building a Bare-Bones Git Environment by Andy Carlson&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;How to migrate repositories from GitHub, configure the software and get started with hosting Git repositories on your own Linux server.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Take Your Git In-House by John S. Tonello&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;If you're wary of the Microsoft takeover of GitHub, or if you've been looking for a way to ween yourself off free public repositories, or if you want to ramp up your DevOps efforts, now's a good time to look at installing and running GitLab yourself. It's not as difficult as you might think, and the free, open-source GitLab CE version provides a lot of flexibility to start from scratch, migrate or graduate to more full-fledged versions.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
Terrible Ideas in Git by Corey Quinn&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;This article was derived from a talk that GitHub Universe faithfully rejects every year. I can't understand why....&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Opinion: GitHub vs GitLab by Matt Lee&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Free software deserves free tools, not Microsoft-owned GitHub.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Other articles in this issue:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Encrypting NFSv4 with Stunnel TLS by Charles Fisher&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;NFS clients and servers push file traffic over clear-text connections in the default configuration, which is incompatible with sensitive data. TLS can wrap this traffic, finally bringing protocol security. Before you use your cloud provider's NFS tools, review all of your NFS usage and secure it where necessary.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Advertising 3.0 by Doc Searls&lt;/p&gt;

&lt;p&gt;Road to RHCA—Preparation Meets Opportunity by Taz Brown&lt;/p&gt;

&lt;p&gt;FOSS Project Spotlight: ONLYOFFICE, an Online Office Suite by Tatiana Kochedykova&lt;/p&gt;

&lt;p&gt;At Rest Encryption by Kyle Rankin&lt;/p&gt;

&lt;p&gt;Progress with Your Image by Kyle Rankin&lt;/p&gt;

&lt;p&gt;FOSS Project Spotlight: Pydio Cells, an Enterprise-Focused File-Sharing Solution by Italo Vignoli&lt;/p&gt;

&lt;p&gt;Atomic Modeling with GAMGI by Joey Bernard&lt;/p&gt;

&lt;p&gt;News Briefs by Jill Franklin&lt;/p&gt;

&lt;p&gt;
Kyle Rankin's Hack and /: What Really IRCs Me: Slack&lt;/p&gt;

&lt;p&gt;Reuven M. Lerner's At the Forge: Introducing Python 3.7's Dataclasses&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/git-your-july-2018-issue-linux-journal-now-available" hreflang="en"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Mon, 02 Jul 2018 17:30:00 +0000</pubDate>
    <dc:creator>Carlie Fairchild</dc:creator>
    <guid isPermaLink="false">1339995 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Terrible Ideas in Git</title>
  <link>https://www.linuxjournal.com/content/terrible-ideas-git</link>
  <description>  &lt;div data-history-node-id="1339949" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/corey-quinn-0" lang="" about="https://www.linuxjournal.com/users/corey-quinn-0" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;Corey Quinn&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;&lt;em&gt;This article was derived from a talk that GitHub Universe faithfully rejects every year. I can't understand why....&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For better or worse, git has become one of the Open Source community's more ubiquitous tools. It lets you manage code effectively. It helps engineers who are far apart collaborate with each other. At its heart, it's very simple, which is why the diagram in so many blog posts inevitably looks something like the one shown in Figure 1.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Image removed." class="image-max_1300x1300 filter-image-invalid" data-entity-type="file" data-entity-uuid="insert-max_1300x1300-27168015-9f3e-42d6-844c-dc7e983a36ef" height="16" src="https://www.linuxjournal.com/core/misc/icons/e32700/error.svg" width="16" title="This image has been removed. For security reasons, only images from the local domain are allowed." /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 1. Git Model (Source: &lt;a href="https://nvie.com"&gt;https://nvie.com&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The unfortunate truth that's rarely discussed in detail is that git has a dark side: it makes us feel dumb. I don't care who you are—we all hit a point wherein we shrug, give up and go scrambling for Stack Overflow (motto: "This thread has been closed as Off Topic") to figure out how best to get out of the terrible situations we've caused for ourselves. The only question is how far down the rabbit hole you can get before the madness overtakes you, and you begin raising goats for a living instead.&lt;/p&gt;

&lt;p&gt;At its core, all git does is track changes to files and folders. &lt;code&gt;git commit&lt;/code&gt; effectively takes a snapshot of the filesystem (as represented by the items added to the staging area) at a given point in time:&lt;/p&gt;

&lt;pre&gt;
&lt;code&gt;
cquinn@1d732dc08938 ~/demo1 % git init
Initialized empty Git repository in /home/cquinn/demo1/.git/
cquinn@1d732dc08938(master|...) ~/demo1 % git add ubuntu.iso
cquinn@1d732dc08938(master|·1) ~/demo1 % git commit
 ↪-m "Initial commit"
[master (root-commit) b0d3bfb] Initial commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 ubuntu.iso
cquinn@1d732dc08938(master|✓) ~/demo1 % git rm --cached
 ↪ubuntu.iso
rm 'ubuntu.iso'
cquinn@1d732dc08938(master|·1✓) ~/demo1 % git
 ↪commit -m "There I fixed it"
[master 2d86934] There I fixed it
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 ubuntu.iso
cquinn@1d732dc08938(master|...) ~/demo1 % du -hs .git
174M    .git
&lt;/code&gt;
&lt;/pre&gt;

&lt;p&gt;So if you do something foolish, such as committing large binaries, you can't just revert the commit—it's still going to live in your git repository. If you've pushed that thing elsewhere, you get to rewrite history forcibly, either with &lt;code&gt;git-filter-branch&lt;/code&gt; or the &lt;code&gt;bfg&lt;/code&gt;. Either way, it's extra work that's unpleasant to others who share your repository.&lt;/p&gt;

&lt;p&gt;Fundamentally, all that git does is create a .git folder in the top level of the repository. This subdirectory contains files and folders that change over time. Wait, isn't there a tool for that?&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/terrible-ideas-git" hreflang="en"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Mon, 02 Jul 2018 13:50:25 +0000</pubDate>
    <dc:creator>Corey Quinn</dc:creator>
    <guid isPermaLink="false">1339949 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Microsoft Buys GitHub: Three Weeks Later</title>
  <link>https://www.linuxjournal.com/content/microsoft-buys-github-three-weeks-later</link>
  <description>  &lt;div data-history-node-id="1339982" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/marcel-gagn%C3%A9" lang="" about="https://www.linuxjournal.com/users/marcel-gagn%C3%A9" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;Marcel Gagné&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;I heard that Microsoft would be buying GitHub just a couple days before it happened when Carlie Fairchild at &lt;em&gt;Linux Journal&lt;/em&gt; told me about it. I replied to the news with a solid, “Get! Out!” Needless to say, I had my doubts. As someone who remembers all too well the “Embrace, extend and extinguish" days of Microsoft, the news of this latest embrace did, however briefly, bring back those old memories. When I was asked what I thought, I answered that &lt;em&gt;the optics were bad&lt;/em&gt;.A lot of years have passed since, back in 2001, &lt;a href="https://www.theregister.co.uk/2001/06/02/ballmer_linux_is_a_cancer"&gt;Steve Ballmer declared Linux to be a cancer&lt;/a&gt;. These days, Microsoft loves Linux. It says so &lt;a href="https://cloudblogs.microsoft.com/windowsserver/2015/05/06/microsoft-loves-linux"&gt;right on its website&lt;/a&gt;. Two years ago, Steve Ballmer also &lt;a href="https://www.zdnet.com/article/ballmer-i-may-have-called-linux-a-cancer-but-now-i-love-it"&gt;proclaimed his love&lt;/a&gt; for Linux. In 2018, Microsoft has its own distribution that it uses in its Azure cloud. Microsoft includes several different flavors of Linux in its app store (the Windows Subsystem for Linux), all of which can be installed on Windows 10. Microsoft develops for Linux. Heck, Microsoft even contributes to the Linux kernel.&lt;/p&gt;

&lt;p&gt;The reason I felt the optics were bad is that Microsoft has spent the last few years going out of its way to paint itself as a friend to Linux and open source. This, I thought, can only be seen as a bad move. Well, it’s been three weeks, more or less, since the the acquisition became official, to the tune of $7.5 billion US. What happened?&lt;/p&gt;

&lt;p&gt;For starters, Jim Zemlin, the Executive Director of the Linux Foundation, praised the Microsoft acquisition of GifHub, suggesting that it could be a good thing for everyone. Former open-source star and the new CEO of GitHub, Nat Friedman, did an AMA on Reddit to reassure developers of open-source software that they had nothing to fear from the new landlords.&lt;/p&gt;

&lt;p&gt;Linus Torvalds, the creator of the Linux kernel and git itself, didn’t comment directly, but he has been critical of GitHub in the past, so perhaps it doesn’t change anything for him. Besides, the kernel is primarily housed on a private git server, and GitHub is just a public mirror for the code.&lt;/p&gt;

&lt;p&gt;That didn’t stop some number of open-source developers from swearing off GitHub and looking for other places to host their projects. GitLab, a minor competitor to GitHub, seemed poised to be the natural beneficiary of this move. In a Twitter post dated June 3rd, it cited that its GitHub to GitLab conversion rate was running at ten times normal.&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/microsoft-buys-github-three-weeks-later" hreflang="en"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Tue, 26 Jun 2018 11:30:00 +0000</pubDate>
    <dc:creator>Marcel Gagné</dc:creator>
    <guid isPermaLink="false">1339982 at https://www.linuxjournal.com</guid>
    </item>

  </channel>
</rss>
