<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>A Waage Blog &#187; Git</title>
	<atom:link href="http://qugstart.com/blog/tag/git/feed/" rel="self" type="application/rss+xml" />
	<link>http://qugstart.com/blog</link>
	<description>Ruby, Rails, Life</description>
	<lastBuildDate>Thu, 10 Nov 2011 00:35:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Git &#8211; Push a branch to remote repository</title>
		<link>http://qugstart.com/blog/git-and-svn/git-push-a-branch-to-remote-repository/</link>
		<comments>http://qugstart.com/blog/git-and-svn/git-push-a-branch-to-remote-repository/#comments</comments>
		<pubDate>Fri, 26 Aug 2011 20:23:00 +0000</pubDate>
		<dc:creator>Andrew Waage</dc:creator>
				<category><![CDATA[Git and SVN]]></category>
		<category><![CDATA[branch]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[push]]></category>
		<category><![CDATA[remote]]></category>

		<guid isPermaLink="false">http://qugstart.com/blog/?p=145</guid>
		<description><![CDATA[So you just created a new branch locally. You put in 200 hours into this branch, and then realize that the only copy of all these changes is on your MacBook! Don&#8217;t get scared, just push the branch to your remote server.
It&#8217;s easy:

$> git push -u &#60;remote-name&#62; &#60;branch-name&#62;

Or, usually:

$> git push -u origin branch-name

]]></description>
			<content:encoded><![CDATA[<p>So you just created a new branch locally. You put in 200 hours into this branch, and then realize that the only copy of all these changes is on your MacBook! Don&#8217;t get scared, just push the branch to your remote server.</p>
<p>It&#8217;s easy:</p>
<pre class='prettyprint' lang='bash'>
$> git push -u &lt;remote-name&gt; &lt;branch-name&gt;
</pre>
<p>Or, usually:</p>
<pre class='prettyprint' lang='bash'>
$> git push -u origin branch-name
</pre>
]]></content:encoded>
			<wfw:commentRss>http://qugstart.com/blog/git-and-svn/git-push-a-branch-to-remote-repository/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adding Git Email Notifications via Post-receive hook</title>
		<link>http://qugstart.com/blog/git-and-svn/adding-git-email-notifications-via-post-receive-hook/</link>
		<comments>http://qugstart.com/blog/git-and-svn/adding-git-email-notifications-via-post-receive-hook/#comments</comments>
		<pubDate>Wed, 19 May 2010 20:39:17 +0000</pubDate>
		<dc:creator>Andrew Waage</dc:creator>
				<category><![CDATA[Git and SVN]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[hook]]></category>
		<category><![CDATA[notifications]]></category>
		<category><![CDATA[post-receive]]></category>

		<guid isPermaLink="false">http://qugstart.com/blog/?p=68</guid>
		<description><![CDATA[This was done on Fedora 10 in my case, but should be similar for all distributions. This is set up on a shared &#8216;central&#8217; repository, where changes are pushed to. That&#8217;s why it&#8217;s done using the post-receive hook (the repository receives changes).
Step 1: Copy (or symlink) the post-receive script, or download it here. The script [...]]]></description>
			<content:encoded><![CDATA[<p>This was done on Fedora 10 in my case, but should be similar for all distributions. This is set up on a shared &#8216;central&#8217; repository, where changes are pushed to. That&#8217;s why it&#8217;s done using the post-receive hook (the repository <em>receives</em> changes).</p>
<p><strong>Step 1</strong>: Copy (or symlink) the post-receive script, or <a href="http://git.kernel.org/?p=git/git.git;a=blob;f=contrib/hooks/post-receive-email;h=60cbab65d3f8230be3041a13fac2fd9f9b3018d5;hb=HEAD">download it here</a>. The script must be in the &#8216;hooks&#8217; directory like this:<br />
$GIT_DIR/hooks/post-receive</p>
<p>I&#8217;ve read that on Debian systems, for example, the hook is stored in /usr/share/doc/git-core/contrib/hooks/post-receive-email but i had no luck finding it here on my system. </p>
<p>Make sure it is named &#8220;post-receive&#8221; so that Git recognizes it.</p>
<p><strong>Step 2</strong>: Make sure that the script is executable:</p>
<pre class="prettyprint" lang="bash">
chmod a+x $GIT_DIR/hooks/post-receive
</pre>
<p><strong>Step 3: </strong>Edit the first line of $GIT_DIR/description to be your repository name. This will be in the subject of the email.</p>
<p><strong>Step 4:</strong> Edit $GIT_DIR/config with some email settings such as recipient / sender email and subject-line prefix. Here&#8217;s some basic settings (read the script for all possible settings).</p>
<pre class="prettyprint" lang="bash">
[hooks]
mailinglist = "receiver1@receivers.com, receiver2@receivers.com"
envelopesender = sender@senders.com
emailprefix = "[GIT] "
</pre>
<p>Note: you can also set these by using git-config:</p>
<pre class="prettyprint" lang="bash">
git-config hooks.mailinglist "receiver1@receivers.com, receiver2@receivers.com"
git-config hooks.envelopesender sender@senders.com
git-config hooks.emailprefix "[GIT] "
</pre>
<p>That&#8217;s it ! Try doing a git-push to your shared repository, and see if you get email notifications. If not, try tailing your mail log to see what&#8217;s wrong (/var/log/maillog).</p>
]]></content:encoded>
			<wfw:commentRss>http://qugstart.com/blog/git-and-svn/adding-git-email-notifications-via-post-receive-hook/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Setup a Git Repository for Redmine</title>
		<link>http://qugstart.com/blog/ruby-and-rails/setup-a-git-repository-for-redmine/</link>
		<comments>http://qugstart.com/blog/ruby-and-rails/setup-a-git-repository-for-redmine/#comments</comments>
		<pubDate>Sat, 24 Oct 2009 00:08:10 +0000</pubDate>
		<dc:creator>Andrew Waage</dc:creator>
				<category><![CDATA[Git and SVN]]></category>
		<category><![CDATA[Ruby and Rails]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Redmine]]></category>
		<category><![CDATA[repository]]></category>

		<guid isPermaLink="false">http://qugstart.com/blog/?p=33</guid>
		<description><![CDATA[Just installed Redmine for our project management / code tracking with Git. I must say it&#8217;s pretty nice being able to setup multiple projects easily (unlike Trac). The system is designed fairly well with a very user-friendly interface. And plus, it&#8217;s Rails !!
Anyways&#8230; too much on Redmine! This post is to describe how to setup [...]]]></description>
			<content:encoded><![CDATA[<p>Just installed Redmine for our project management / code tracking with Git. I must say it&#8217;s pretty nice being able to setup multiple projects easily (unlike Trac). The system is designed fairly well with a very user-friendly interface. And plus, it&#8217;s Rails !!</p>
<p>Anyways&#8230; too much on Redmine! This post is to describe how to setup a Git repository for use with Redmine.</p>
<p>The important thing to note is that the Git repository MUST BE on the same server as your Redmine setup. So, you probably need to have access to that server!<br />
This was not ideal for me because our Git server does not have Ruby/Rails, etc. installed on it. That&#8217;s okay! You just need to clone the repository as a BARE repository on the same machine that your Redmine app is running on. Let&#8217;s see how:</p>
<p>Pick a place on your Redmine app server to house all your bare Git repos.<br />
I will choose &#8220;/var/local/git_copies&#8221; for my example.</p>
<p>Note: Make sure that your permissions allow for your web-user to access these Git repos. My web-user is &#8216;build&#8217;.</p>
<pre lang='bash' class='prettyprint'>
# Change to build user (see above)
$ su - build
# Create the directory
$ mkdir /var/local/git_copies
</pre>
<p>Now, create your git clone as a bare repository clone.<br />
Note: a bare repository will not have your actual files. It will just contain the standard git folders</p>
<pre lang='bash' class='prettyprint'>
# Goto your git_copies directory
$ cd /var/local/git_copies
# Make a bare clone of the repo
$ git clone --bare ssh://git@reposerver/usr/local/git_root/foo-project.git
</pre>
<p>Change into your project and configure remote branch tracking for your local copy.</p>
<pre lang='bash' class='prettyprint'>
$ cd foo-project.git
$ git remote add origin ssh://git@reposerver/usr/local/git_root/foo-project.git
</pre>
<p>Now, normally you want to sync up the repo, but you cannot do a normal git fetch &#038;&#038; git merge into a bare repo.<br />
Instead, do a fetch and reset the HEAD to point to the remote branch commit. You need the &#8216;&#8211;soft&#8217; flag or else you will see errors!</p>
<pre lang='bash' class='prettyprint'>
$ git fetch origin
$ git reset --soft refs/remotes/origin/master
</pre>
<p>Now, remember you need to manually sync your new Git repo to have the changes appear on Redmine. A better idea would be to create a cronjob that does this automatically. Especially with more than 1 repository, automating this process will save much time. Here&#8217;s the basic idea:</p>
<pre lang='cron' class='prettyprint'>
# Add the following to your crontab
*/30 * * * * cd /var/local/git_copies/foo-project.git &#038;&#038; git fetch origin &#038;&#038; git reset --soft refs/remotes/origin/master > /dev/null
</pre>
<p>Instead of doing many times in your crontab, maybe it would be easier to setup a bash script to run:</p>
<pre lang='cron' class='prettyprint'>
#!/bin/bash
# Not tested! Use at your own risk, and change your GIT_ROOT and "*.git" to fit your setup.
GIT_ROOT=/var/local/git_copies

cd $GIT_ROOT
ls *.git | while read repo; do
  cd $repo &#038;&#038; git fetch origin &#038;&#038; git reset --soft refs/remotes/origin/master > /dev/null &#038;&#038; cd $GIT_ROOT
done
</pre>
<p>Then, just add this one script to your crontab and have it run every N minutes as you desire!</p>
<p>This site is helpful and worth checking out as well:<br />
<a href="http://www.pragmatic-source.com/en/opensource/tips/automatic-synchronization-2-git-repositories">Reference on synchronizing 2 git repositories</a></p>
<p>That&#8217;s it, let me know how it goes!</p>
]]></content:encoded>
			<wfw:commentRss>http://qugstart.com/blog/ruby-and-rails/setup-a-git-repository-for-redmine/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Create a new Git Remote Repository from some local files (or local git repository)</title>
		<link>http://qugstart.com/blog/ruby-and-rails/create-a-new-git-remote-repository-from-some-local-files-or-local-git-repository/</link>
		<comments>http://qugstart.com/blog/ruby-and-rails/create-a-new-git-remote-repository-from-some-local-files-or-local-git-repository/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 20:06:18 +0000</pubDate>
		<dc:creator>Andrew Waage</dc:creator>
				<category><![CDATA[Git and SVN]]></category>
		<category><![CDATA[Ruby and Rails]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[local repository]]></category>
		<category><![CDATA[remote tracking]]></category>
		<category><![CDATA[setup]]></category>

		<guid isPermaLink="false">http://qugstart.com/blog/?p=30</guid>
		<description><![CDATA[So you have some files or a new Rails application, and you want to add this to a new shared remote Git repository. (I&#8217;m assuming you have access to your server and are setting up a remote repo over ssh.)
I know I can never remember how to do it, so here&#8217;s a post for me [...]]]></description>
			<content:encoded><![CDATA[<p>So you have some files or a new Rails application, and you want to add this to a new shared remote Git repository. (I&#8217;m assuming you have access to your server and are setting up a remote repo over ssh.)</p>
<p>I know I can never remember how to do it, so here&#8217;s a post for me and hopefully you!</p>
<p>Create a local Git repository in your application for your local files.</p>
<pre class="prettypring" lang="bash">#On local machine
cd foo_project
git init
git add *
git commit -m "My initial commit message"</pre>
<p>Now, create the repository on your Git server. All of my git repositories are owned by a user git and located at /usr/local/git_root/. You can change these things accordingly to match your server setup.</p>
<pre class="prettyprint" lang="bash">#On remote machine (Git remote repository)
sudo su - git
cd /usr/local/git_root/</pre>
<p>Create your new project git repo as a bare Git repository</p>
<pre class="prettyprint" lang="bash">mkdir foo-project.git
cd foo-project.git/
git --bare init</pre>
<p>Make sure permissions are set properly. These are common options I use for my shared repositories</p>
<pre class="prettyprint" lang="bash">git config core.sharedrepository 1
git config receive.denyNonFastforwards true
find objects -type d -exec chmod 02770 {} \;
#The core.sharedrepository flag tells git to keep everything group readable and writable.
#The receive.denyNonFastforwards flag makes sure that merges can't happen when you push to the repo. You have to do the merges on your local machine, and then push the result.</pre>
<p>Now, go back to your local repository, and add the newly created remote repository so it tracks from the remote repository (origin).</p>
<pre class="prettyprint" lang="bash">#On local machine, in your git project
git remote add origin ssh://git@example.com:2227/usr/local/git_root/foo_project.git
git push origin master</pre>
<p>Now, to ensure that your local branch is tracking when you do a fetch, you need to use -f option to force a new local branch to be created even though it already exists.</p>
<pre class="prettyprint" lang="bash">
#Switch to origin/master so you don't get any error about "fatal: Cannot force update the current branch."
git checkout origin/master
#Create the local "master" branch that is tracking the "origin/master" branch
git branch -f master origin/master
#Switch back to your "master" branch
git checkout master
</pre>
<p>There you have it. You should be able to push changes to origin and fetch changes to your local copy!</p>
]]></content:encoded>
			<wfw:commentRss>http://qugstart.com/blog/ruby-and-rails/create-a-new-git-remote-repository-from-some-local-files-or-local-git-repository/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>Add colored git branch name to your shell prompt</title>
		<link>http://qugstart.com/blog/git-and-svn/add-colored-git-branch-name-to-your-shell-prompt/</link>
		<comments>http://qugstart.com/blog/git-and-svn/add-colored-git-branch-name-to-your-shell-prompt/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 22:10:55 +0000</pubDate>
		<dc:creator>Andrew Waage</dc:creator>
				<category><![CDATA[Git and SVN]]></category>
		<category><![CDATA[branch]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[prompt]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://qugstart.com/blog/?p=11</guid>
		<description><![CDATA[Here&#8217;s a little trick to get the name of your current git branch in your shell prompt. No more figuring out that you have made changes to the wrong branch once it&#8217;s too late! Your shell will not change for normal (non-git) folders. But, once you change directory into a git project, you will see [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a little trick to get the name of your current git branch in your shell prompt. No more figuring out that you have made changes to the wrong branch once it&#8217;s too late! Your shell will not change for normal (non-git) folders. But, once you change directory into a git project, you will see the branch name added to your shell prompt like such:</p>
<pre lang="bash" class="prettyprint">
Macintosh-2:git_project_foo andyuser [master] $
</pre>
<p>Simply add the following to your ~/.bash_profile or ~/.bashrc file:</p>
<pre lang="bash" class="prettyprint">
function parse_git_branch_and_add_brackets {
git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\ \[\1\]/'
}
PS1="\h:\W \u\[\033[0;32m\]\$(parse_git_branch_and_add_brackets) \[\033[0m\]\$ "
</pre>
<p>That&#8217;s all there is to it ! Try it out !</p>
]]></content:encoded>
			<wfw:commentRss>http://qugstart.com/blog/git-and-svn/add-colored-git-branch-name-to-your-shell-prompt/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Migrate an SVN repository to Git While Maintaining Branches and Tags Structure</title>
		<link>http://qugstart.com/blog/git-and-svn/migrate-an-svn-repository-to-git-while-maintaining-branches-and-tags-structure/</link>
		<comments>http://qugstart.com/blog/git-and-svn/migrate-an-svn-repository-to-git-while-maintaining-branches-and-tags-structure/#comments</comments>
		<pubDate>Fri, 04 Sep 2009 01:02:32 +0000</pubDate>
		<dc:creator>Andrew Waage</dc:creator>
				<category><![CDATA[Git and SVN]]></category>
		<category><![CDATA[branches]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[migrate]]></category>
		<category><![CDATA[repository]]></category>
		<category><![CDATA[SVN]]></category>
		<category><![CDATA[tags]]></category>
		<category><![CDATA[trunk]]></category>

		<guid isPermaLink="false">http://qugstart.com/blog/?p=8</guid>
		<description><![CDATA[Git is awesome, but for our Rails projects, we like to follow a similar &#8220;centralized repository model&#8221; that SVN makes use of.
We want to use distributed Git repositories, with one central &#8220;shared&#8221; repository to use for deployments, etc.
We don&#8217;t want to use Git with a shared SVN repository. (git-svn)
And, we have a bunch of SVN [...]]]></description>
			<content:encoded><![CDATA[<p>Git is awesome, but for our Rails projects, we like to follow a similar &#8220;centralized repository model&#8221; that SVN makes use of.<br />
We want to use distributed Git repositories, with one central &#8220;shared&#8221; repository to use for deployments, etc.<br />
We don&#8217;t want to use Git with a shared SVN repository. (git-svn)<br />
And, we have a bunch of SVN repositories already that we need to migrate to Git repositories.</p>
<p>I&#8217;ll describe what I did to make this happen:</p>
<p>Notes, quotes, credits all from: <a href="http://notahat.com/posts/25">http://notahat.com/posts/25</a></p>
<p>This is a great post to follow, and accounts for most everything I did here.<br />
The difference is that I&#8217;m using svn2git, instead of doing manual git clone commands.<br />
The above post will only set up remote branches, and what I wanted was to have all branches and tags local to my new Git repository.<br />
Svn2git will copy all of your branches / tags from the original SVN repository into your new Git repository as well.<br />
(Check it out here [thanks to nirvdrum]: <a href="http://github.com/nirvdrum/svn2git/tree/master">http://github.com/nirvdrum/svn2git/tree/master</a>)</p>
<p>Let&#8217;s say I have an SVN repository structured as:</p>
<pre lang="bash" class="prettyprint">trunk
...
branches
1.x
2.x
tags
1.0.0
1.0.1
1.0.2
1.1.0
2.0.0</pre>
<p>Our goal is to have a git repository with native tags/branches taken from our SVN repository.<br />
At the end of my migration, I want my Git repo to look like:</p>
<pre lang="bash"  class="prettyprint">$ git branch
* master
1.x
2.x
$ git tag -l
1.0.0
1.0.1
1.0.2
1.1.0
2.0.0</pre>
<p>#Make sure Git is installed:<br />
#If you don&#8217;t have the epel yum repository enabled by default, you must specify to enable it at the command line:<br />
#For other distributions, you know the drill (apt-get, port, etc.)</p>
<pre lang="bash" class="prettyprint">yum --enablerepo epel install 'git'
yum --enablerepo epel install 'git-svn'</pre>
<p>#Now, create a system git user and group</p>
<pre lang="bash" class="prettyprint">sudo adduser git</pre>
<p>#Now edit /etc/group, and add any users who&#8217;ll need to access the Git repository to the git group:</p>
<pre lang="bash" class="prettyprint">...
git:x:100:james,paul
...</pre>
<p>#Make a directory for Git repositories<br />
#We chose: /usr/local/git_root</p>
<pre lang="bash" class="prettyprint">sudo mkdir /usr/local/git_root
sudo chown git.git /usr/local/git_root
sudo chmod 2770 /usr/local/git_root</pre>
<p>#Create your svn-authors.txt in /usr/local/git_root/svn-authors.txt to tell Git how to convert SVN usernames in the logs:<br />
#Place *ALL* SVN authors in this file so that git doesn&#8217;t complain when it cannot find a particular user to convert.</p>
<p>pbunyan = Paul Bunyan &lt;pbunyan@example.com&gt;<br />
jbond = James Bond &lt;jbond@example.com&gt;</p>
<p>On the left are the Subversion user names; on the right are the Git equivalents.</p>
<p>#Make sure your gem sources include github.com (if necessary)</p>
<pre lang="bash" class="prettyprint">sudo gem sources -a http://gems.github.com</pre>
<p>#Install the svn2git gem</p>
<pre lang="bash" class="prettyprint">sudo gem install nirvdrum-svn2git</pre>
<p>#Verify that you have svn2git in your PATH</p>
<pre lang="bash" class="prettyprint">which svn2git</pre>
<p>#We will create a temporary directory in /tmp/<br />
#This is where we will fetch the SVN repo into a git repo.<br />
#We&#8217;ll then use this temporary repo to create our bare repository.</p>
<pre lang="bash" class="prettyprint">mkdir /tmp/foo-project
cd /tmp/foo-project</pre>
<p>#I&#8217;m assuming you have the standard SVN setup of</p>
<pre lang="bash" class="prettyprint">-root
---trunk
---branches
---tags</pre>
<p>If not, you can look into the options of svn2git to match your SVN repo structure.</p>
<p>#Run the command given your svn-authors file:</p>
<pre lang="bash" class="prettyprint">svn2git https://svn-repo/foo-project --authors /usr/local/git_root/svn-authors.txt</pre>
<p>#You can go into this folder and verify that you see all your local branches and tags by running:</p>
<pre lang="bash" class="prettyprint">git branch
and
git tag -l</pre>
<p>This should print out the lists of your branches and tags if everything is working right so far!</p>
<p>Next, we want to create our bare repository in /usr/local/git_root.</p>
<p>#Become git user and set permissions</p>
<pre lang="bash" class="prettyprint">sudo su - git
cd /usr/local/git_root/
umask 007</pre>
<p>#Clone the temporary repository created by svn2git to a bare repository.<br />
#&lt;project&gt;.git is a local convention.</p>
<pre lang="bash" class="prettyprint">git clone --bare /tmp/foo-project foo-project.git
cd foo-project.git/</pre>
<p>#Make sure permissions are set properly</p>
<pre lang="bash" class="prettyprint">git config core.sharedrepository 1
git config receive.denyNonFastforwards true
find objects -type d -exec chmod 02770 {} \;</pre>
<p>The core.sharedrepository flag tells git to keep everything group readable and writable.<br />
The receive.denyNonFastforwards flag makes sure that merges can&#8217;t happen when you push to the repo. You have to do the merges on your local machine, and then push the result.</p>
<p>#Try to do a git clone from your workstation (another computer)</p>
<pre lang="bash" class="prettyprint">git clone ssh://git-repo:22/usr/local/git_root/foo-project.git</pre>
<p>#Clean up<br />
Once you&#8217;re happy that everything is working, delete the temporary repo that you created in /tmp, and you&#8217;re done!</p>
]]></content:encoded>
			<wfw:commentRss>http://qugstart.com/blog/git-and-svn/migrate-an-svn-repository-to-git-while-maintaining-branches-and-tags-structure/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

