<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://training-course-material.com/index.php?action=history&amp;feed=atom&amp;title=Git_for_Victims_of_Subversion</id>
	<title>Git for Victims of Subversion - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://training-course-material.com/index.php?action=history&amp;feed=atom&amp;title=Git_for_Victims_of_Subversion"/>
	<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=Git_for_Victims_of_Subversion&amp;action=history"/>
	<updated>2026-05-13T06:50:46Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://training-course-material.com/index.php?title=Git_for_Victims_of_Subversion&amp;diff=52492&amp;oldid=prev</id>
		<title>84.10.6.178: /* Exercises */</title>
		<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=Git_for_Victims_of_Subversion&amp;diff=52492&amp;oldid=prev"/>
		<updated>2017-02-22T12:01:18Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Exercises&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:Git|050]]&lt;br /&gt;
== Initializing new projects ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;400px&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Git !! SVN&lt;br /&gt;
|-&lt;br /&gt;
|  &lt;br /&gt;
 git init&lt;br /&gt;
 git add .&lt;br /&gt;
 git commit           &lt;br /&gt;
|| &lt;br /&gt;
 svnadmin create repo&lt;br /&gt;
 svn import file://repo&lt;br /&gt;
 svn checkout file://repo .&lt;br /&gt;
or&lt;br /&gt;
 svnadmin create repo&lt;br /&gt;
 svn checkout repo .&lt;br /&gt;
 svn add .&lt;br /&gt;
 svn commit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:Git-ini.png|400px]]&lt;br /&gt;
&lt;br /&gt;
== Browsing repository ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! Git !! SVN&lt;br /&gt;
|-&lt;br /&gt;
|  &lt;br /&gt;
 git show rev:file &lt;br /&gt;
 git show rev:directory  &lt;br /&gt;
 git show rev&lt;br /&gt;
|| &lt;br /&gt;
 svn cat file &lt;br /&gt;
 svn list directory &lt;br /&gt;
&lt;br /&gt;
 svn log -rrev url &lt;br /&gt;
 svn diff -crev url   &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Exporting ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Git !! SVN&lt;br /&gt;
|-&lt;br /&gt;
|   &lt;br /&gt;
 git archive&lt;br /&gt;
 git archive --format=zip HEAD &amp;gt; project.zip&lt;br /&gt;
|| &lt;br /&gt;
 svn export    &lt;br /&gt;
 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Basic Commands ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! Git !! SVN&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
 git add file   &lt;br /&gt;
 git rm file &lt;br /&gt;
 git mv file&lt;br /&gt;
||  &lt;br /&gt;
 svn add file   &lt;br /&gt;
 svn rm file&lt;br /&gt;
 svn mv file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Committing ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Git !! SVN&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
 git commit -a&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;git commit (without -a) will NOT add all added files!!!&amp;#039;&amp;#039;&amp;#039;    &lt;br /&gt;
&lt;br /&gt;
Have a look at &lt;br /&gt;
 git commit -a -v&lt;br /&gt;
|| &lt;br /&gt;
 svn commit          &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:Git-commit-a1.png|250px]] [[File:Git-commit-a2.png|250px]]&lt;br /&gt;
&lt;br /&gt;
== Exercise ==&lt;br /&gt;
# sudo mkdir /rcs&lt;br /&gt;
# sudo chmod 777 /rcs&lt;br /&gt;
# mkdir /rcs/repo&lt;br /&gt;
# cd /rcs/repo&lt;br /&gt;
# echo first line &amp;gt; afile.txt&lt;br /&gt;
# mkdir afolder&lt;br /&gt;
# Initialize repository&lt;br /&gt;
# Add all files to the repository&lt;br /&gt;
# Check whether files have been added&lt;br /&gt;
# Commit the changes&lt;br /&gt;
# Check whether the files have been committed&lt;br /&gt;
# What is the SHA1 of the commit?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tracking Changes ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Git !! SVN&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
 git diff&lt;br /&gt;
 git diff rev path&lt;br /&gt;
 git apply&lt;br /&gt;
 git status&lt;br /&gt;
 git show&lt;br /&gt;
|| &lt;br /&gt;
 svn diff | less&lt;br /&gt;
 svn diff -rrev path&lt;br /&gt;
 patch -p0&lt;br /&gt;
 svn status&lt;br /&gt;
 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reverting ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Git !! SVN&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
 git checkout path&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Removes all local changes!!!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|| &lt;br /&gt;
 svn revert path&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Working with SVN (git svn) ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Create SVN repo&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 mkdir svn; cd svn&lt;br /&gt;
 svnadmin create ./&lt;br /&gt;
 svn mkdir file:///rcs/svn/afolder&lt;br /&gt;
 svn import /etc/passwd file:///rcs/svn/passwod&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Check it out with git&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 mkdir gitsvnwc&lt;br /&gt;
 git svn clone file:///rcs/svn gitsvnwc/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Updating (git svn) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Pull changes from SVN !! Push changes to SVN&lt;br /&gt;
|-&lt;br /&gt;
| Make some changes to the SVN repo&lt;br /&gt;
 svn import /etc/resolv.conf file:///rcs/svn/resolv.conf&lt;br /&gt;
Update git working copy&lt;br /&gt;
 git svn rebase&lt;br /&gt;
|| &lt;br /&gt;
 echo aline &amp;gt; afile.txt&lt;br /&gt;
 git add afile.txt&lt;br /&gt;
 git commit&lt;br /&gt;
 git svn dcommit &lt;br /&gt;
 svn ls file:///rcs/svn&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== git svn limitations ==&lt;br /&gt;
* Some of the Git features do not work in SVN&lt;br /&gt;
* Do not dcommit Git merge commits to the Subversion repository (i.e., no merging from other branches, just rebasing)&lt;br /&gt;
* Do not amend, reorder, or otherwise change commits that have been dcommited to Subversion (same as to the central git repo). Subversion cannot handle modifying or reordering commits.&lt;br /&gt;
&lt;br /&gt;
== Exercises ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SVN to GIT&lt;br /&gt;
&lt;br /&gt;
1. Server and repos preparations:&lt;br /&gt;
&lt;br /&gt;
## svn part&lt;br /&gt;
sudo mkdir /rcs&lt;br /&gt;
sudo chmod 777 /rcs&lt;br /&gt;
cd /rcs&lt;br /&gt;
mkdir svn; cd svn&lt;br /&gt;
svnadmin create ./&lt;br /&gt;
svn mkdir file:///rcs/svn/trunk&lt;br /&gt;
svn mkdir file:///rcs/svn/branches&lt;br /&gt;
svn mkdir file:///rcs/svn/tags&lt;br /&gt;
svn import ~/slideshow_ file:///rcs/svn/trunk&lt;br /&gt;
svn copy file:///rcs/svn/trunk file:///rcs/svn/branches/slbr1 -m &amp;quot;New branch&amp;quot;&lt;br /&gt;
svn copy file:///rcs/svn/trunk file:///rcs/svn/tags/v1.0 -m &amp;quot;Tagging first stable version&amp;quot;&lt;br /&gt;
# new user-devel&lt;br /&gt;
sudo adduser geek&lt;br /&gt;
sudo usermod -G osboxes -a geek&lt;br /&gt;
su geek&lt;br /&gt;
cd&lt;br /&gt;
&lt;br /&gt;
svn checkout file:///rcs/svn/trunk ~/wc1svn&lt;br /&gt;
cd ~/wc1svn&lt;br /&gt;
echo geek &amp;gt; logo.html&lt;br /&gt;
svn ci -m &amp;quot;geek change&amp;quot;&lt;br /&gt;
svn st -uv&lt;br /&gt;
exit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Simple migration without: history, branches and tags&lt;br /&gt;
&lt;br /&gt;
cd&lt;br /&gt;
mkdir gitsvnwc&lt;br /&gt;
git svn clone file:///rcs/svn gitsvnwc/&lt;br /&gt;
cd gitsvnwc&lt;br /&gt;
git svn log&lt;br /&gt;
git log&lt;br /&gt;
&lt;br /&gt;
rm -Rf .git branches tags&lt;br /&gt;
cd trunk&lt;br /&gt;
git init&lt;br /&gt;
git add .&lt;br /&gt;
git commit -m &amp;quot;moved from svn without history, etc&amp;quot;&lt;br /&gt;
git clone --bare . ~/repos/newslideshow.git&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Migration with nicer history and users&amp;#039; credentials&lt;br /&gt;
&lt;br /&gt;
cd&lt;br /&gt;
mkdir gitsvnwc1&lt;br /&gt;
git svn clone file:///rcs/svn gitsvnwc1/&lt;br /&gt;
cd gitsvnwc1&lt;br /&gt;
touch users.txt&lt;br /&gt;
nano users.txt&lt;br /&gt;
####&lt;br /&gt;
osboxes = Ms Devel &amp;lt;msdevel@gmail.com&amp;gt;&lt;br /&gt;
geek = Geek Geekovsky &amp;lt;gg@gmail.com&amp;gt;&lt;br /&gt;
####&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cd&lt;br /&gt;
svn checkout file:///rcs/svn/trunk ~/wc2svn&lt;br /&gt;
cd ~/wc2svn&lt;br /&gt;
svn log --xml --quiet | grep author | sort -u | perl -pe &amp;#039;s/.*&amp;gt;(.*?)&amp;lt;.*/$1 = /&amp;#039; &amp;gt; users1.txt&lt;br /&gt;
nano users1.txt&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cd ~/gitsvnwc1&lt;br /&gt;
git svn clone file:///rcs/svn/ --authors-file=/home/osboxes/gitsvnwc1/users.txt --no-metadata --prefix &amp;quot;&amp;quot; -s ~/slideshow_nice&lt;br /&gt;
cd ~/slideshow_nice&lt;br /&gt;
git log&lt;br /&gt;
git tag&lt;br /&gt;
git branch -a&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# migrating tags:&lt;br /&gt;
# for t in $(git for-each-ref --format=&amp;#039;%(refname:short)&amp;#039; refs/remotes/tags); do git tag ${t/tags\//} $t &amp;amp;&amp;amp; git branch -D -r $t; done&lt;br /&gt;
&lt;br /&gt;
# migrating branches:&lt;br /&gt;
# for b in $(git for-each-ref --format=&amp;#039;%(refname:short)&amp;#039; refs/remotes); do git branch $b refs/remotes/$b &amp;amp;&amp;amp; git branch -D -r $b; done&lt;br /&gt;
&lt;br /&gt;
# cleaning:&lt;br /&gt;
# git branch -d trunk&lt;br /&gt;
&lt;br /&gt;
# Connecting to new remote git server:&lt;br /&gt;
# git clone --bare ~/slideshow ~/repos/slideshowclean.git&lt;br /&gt;
# git remote add origin ~/repos/slideshowclean.git&lt;br /&gt;
&lt;br /&gt;
# Pushing to repo&lt;br /&gt;
# git push origin --all&lt;br /&gt;
# git push origin --tags&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. Working with &amp;#039;git svn&amp;#039; bridge tool&lt;br /&gt;
(https://training-course-material.com/training/Git_for_Victims_of_Subversion)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
5. Refusing force-pushes, etc&lt;br /&gt;
&lt;br /&gt;
git config --system receive.denyNonFastForwards true&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Workaround for user: delete the branch and then push it back up with the new reference&lt;br /&gt;
Solution for admins:&lt;br /&gt;
&lt;br /&gt;
git config --system receive.denyDeletes true&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
6. Blocking edition of files for specific users, etc&lt;br /&gt;
(https://git-scm.com/book/en/v2/Customizing-Git-An-Example-Git-Enforced-Policy)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>84.10.6.178</name></author>
	</entry>
</feed>