Difference between revisions of "Hints for Using SVN to collaborate on school projects"

From CDOT Wiki
Jump to: navigation, search
(Basic Actions)
(merge)
Line 73: Line 73:
 
To '''commit''' is to apply (that is, to copy) your modifications and additions to the repository server.
 
To '''commit''' is to apply (that is, to copy) your modifications and additions to the repository server.
 
==== merge ====
 
==== merge ====
'''merge''' is the opposite of '''branch'''.
+
To '''"merge"''' is to merge back a branched directory, back to the original directory; that is, to apply the modifications and additions to the '''branch'''ed directory.
: To '''"merge"''' is to merge back a branched directory, back to the original directory; that is, to apply the modifications and additions to the '''branch'''ed directory.
+
: '''merge''' is the opposite of '''branch'''.
 +
 
 
==== export ====
 
==== export ====
 
To '''export''' is to copy the whole or part of a repository to a non-versioned directory on the client machine
 
To '''export''' is to copy the whole or part of a repository to a non-versioned directory on the client machine

Revision as of 15:32, 27 September 2011

This is a "how to" document for using a graphical user interface with SVN. Graphical user interfaces include


Help improve this document by adding SVN command line commands for examples.

SVN Basics

Directory Structure

|-- Team_Repository_Account
  +--branches
  | +-- member-id1  <-- this is a team member's home within branches
  |   +-- Task1
  |   +-- Task2
  | +-- member-id2  <-- this is a team member's home within branches
  |   +-- Task1
  |   +-- Task2
  |   +-- Task3
  | +-- member-id3  <-- this is a team member's home within branches
  |   +-- Task1
  +--tags
  | +-- R0.1
  | +-- R0.11
  | +-- R0.2
  | +-- R0.21
  | +-- ...
  | +-- R0.5
  | +-- ...
  | +-- R1.0
  | +-- R1.1
  | +-- R1.2
  | +-- R1.21
  +--trunk

branches

  • branches is the common directory for all team members' workspaces.
  • Each team member should create their own home directory or workspace (member-id1, member-id2,...) for their own development tasks within branches.
  • Each team member should divide their workspace into several sub-directories (workspaces) during the development of the project. These workspaces(Task1, Task2, ...) are usually copies of the trunk to be worked on.
    These sub-directories(Task1, Task2,...) are called branches of trunk. When the word branch is used as a verb, it means copying the whole trunk into a sub-directory, either in branches or tags.

tags

  • tags is the directory that holds copies of successful stages of trunk throughout development. (Also called as Milestones)
  • tags are never modified or edited. You may branch a directory of tag into branches under a workspace and then modify the branch and apply the changes back to trunk, but you should never change the contents of a tag
  • The action of branching the trunk into tags is often referred to as a release.
  • We use the tags directory to submit the work for marking. Your instructor will specify the requirements of a release.
    • A release is usually tagged by a version number like: R0.1, Prj0.2, As1_1.0
    • When a release is due, your instructor will always mark the latest version of that release.
      If R0.3 is due, and R0.3, R0.31, R0.32 are present in tags, then your instructor will mark R0.32

trunk

  • trunk is the directory that holds the project in its current stage, complied and run-able
  • trunk should never hold non-compiled code. Usually trunk is an exact copy (or better than) the latest version in tags.
  • If only one project is within the repository, then trunk has no project level sub-directory and is the root of the project. If more than one project is within the repository, trunk is divided into several aub-directories for each project to be version-controlled.
    In this case tags should also be divided into exactly the same project sub-directories as trunk

Basic Actions

A few important facts and terminology to help clarify the basic actions:

  • One responsibility of a code repository is to keep track of all of the modifications done to a project by its team members.
    In other words, in a project that is handled by a code repository (version-controlled or in short versioned), you can track any changes during the project's development life; such as, who modified/added/deleted what and when. You can undo work or rollback the work to any stage of the development and much more.
  • SVN is a client/server repository;
    The code is kept on a server and those members who have access can copy the whole or parts of the project to their local machines, work on the whole or parts and then apply their changes back to the server. Because of this, one member may be unaware of the changes made by another member, unless the other has applied the changes to the server.
  • Merging the modifications of different members into the repository is another responsibility.
  • A Version-controlled or versioned file is a file that is handled and tracked by a repository

checkout

To checkout is to copy the code from a repository server to a versioned directory on the client, so that you can start working on the code.

branch

To branch is to copy a directory (like trunk) into another directory on the repository server.

Note that after branching the code is copied on the repository itself and not to the local(client) machine. To work on the branched (copied) code, you must checkout the directory after the branching.

add

To add is to flag a non-versioned file or directory to be added to the repository server at next commit

commit

To commit is to apply (that is, to copy) your modifications and additions to the repository server.

merge

To "merge" is to merge back a branched directory, back to the original directory; that is, to apply the modifications and additions to the branched directory.

merge is the opposite of branch.

export

To export is to copy the whole or part of a repository to a non-versioned directory on the client machine

You export when you want either to package the project, to make it ready for production, or to copy a piece of work from one repository to another repository.

import

To import is to copy a non-versioned work (directory) to a repository server.

note that in this case the imported code is on the server and is still NOT versioned on the client machine; to start working on an imported directory, you should first checkout the directory from the repository to the client machine.

Starting the Project On SVN

There are two possibilities to initiate a project:

  1. Start the project from zero
    This is when you create an empty project and start to write the code from scratch
  2. Start the project by continuing an existing work
    This is when someone else has started the project (i.e. Professor, other team-members, etc.) and you want to copy the work into your own repository and continue that work.

Start the Project from zero

For this you should create the basic framework of your project in trunk, and Add and Commit it. This is how you do this:

  1. checkout the project repository in a new directory on your computer;
    1. Create a new directory on your computer, right click on it and then click on SVN Checkout
    2. In URL of repository type your repository path (svn://zenit.senecac.on.ca/....)
    3. click on ok
  2. If the basic directories (trunk, tags, branches) don't exist create them and then add them by right clicking on them and selecting ...SVN/Add.
  3. In trunk, create your basic project framework, compile and run it. (this could be as simple as few empty files or a Hello world application).
  4. Right click on the trunk and select ....SVN/Add again and select all the needed file to be added to the repository.
    Add only those files that should be tracked for modification; "Those need to be version-controlled". Binary and Executable files are usually not added to the repository; Only add them if you know what you are doing.
  5. Right click on trunk and select SVN Commit to commit your work to repository server.

Start the project by continuing an existing work

To continue an existing work, you should have a non-versioned copy of the initial code for your project. You should copy this code into the trunk, add and commitit. These are the steps:

  1. Copy the initial code into the trunk of your repository
    If the code is available in another repository (say RepoSrc), export from RepoSrc into trunk of your repository (say RepoDest)
    1. update RepoSrc to make sure that it is in sync with the server.
    2. Right click on the directory with the initial code in RepoSrc and select "...SVN/export".
    3. Select the trunk of RepoDest and click OK
      This will create a "non-version-controlled" copy of the initial code in RepoDest/trunk
  2. Do any modification needed to make the initial code ready for work
  3. Right click on RepoDest/trunk and select Add. Then choose the files that you want to be "versioned"
  4. Finally, Commit the trunk to copy the files to the SVN server.

Preparing Branches/workspace for development

For this you should create a home direcotry for your development in branches using your seneca-id. Then your should branch the trunk into the proper workspace in your home directory in branches. Finally you should update, so the new workspace is added to your copy of the repository on your machine. Here is how:

  1. Create a directory with your seneca-id in branches and add it to the repository and then commit branches to update the repository server.
  2. Right click on the trunk and select ...SVN/"Branch/Tag" to create a branch for your next task
    • By doing this you will create your first workspace to start implementation in the project. Fore next step, choose a relevant name for the task assigned to you, for example if your project is writing a text editor an your next task is to implement "Copy And Past" feature, then the proper name would something like: "CopyPaste"
    • In "To URL" type or select your home dir in the branches dir, then add "/CopyPaste" to it: (svn://RepoUrlAndPath/branches/yourSenecaid/CopyPaste")
    • Select HEAD revision or a specific revision if necessary (mostly head revision applies in our case)
    • Add a proper message for others to know what you have done
    • Click on OK
    This copies the trunk into a branch so you can start your implementation, but note that this action is done on server and your local copy of repository still remains the same.
  3. Right click on branches and click SVN update, this will bring the new branch to your machine.

working on your branch/workspace

  • You can now start implementing your assigned tasks.
    Unlike trunk, since this is YOUR workspace you can leave it an any stage you like. don't forget to comment every and each of your commits so later you know which commit belongs to what and also helps your professor to mark your.
  • If you do not comment a COMMIT, it means it is minor and does not need to be marked
  • You can work form home, commit your work( make sure you add comment to your commit) and them come to school checkout your code work and commit and continue later.
  • Make sure if you are working on a public computer, you delete the your work from local computer, after you committed it to the repository.
    It is your responsibility to keep your code safe
  • If you have any problem with your code, and need help, contact your professor, send the path of your workspace. If needed, he can checkout your code see what is wrong with it and leave comments on it and commit it. Afterwards, all you need to do is update your repo and read the comments and corrected code.

Merging your work back to trunk

After you have done your work in your workspace and your work is compiling and ready to go, to merge your work back to trunk:

  1. Right click on trunk or trunk/prj, depending on what you branched into branches
  2. Select "...SVN/Merge" and select "reintegrate a branch" and click on next.
  3. Make sure "From URL" is the branch you want to merge and click on next.
  4. click on "test merge" to see if merge is done successfully.
  5. click on "merge" to merge the branch back to trunk
  6. now update the trunk to have the possible changes applied.
  7. if there is any conflict click on "...SVN/edit conflicts" and fix the conflict, save and click on conflict resolved"
  8. check the trunk status in your team page on wiki
    • If the trunk status is "committed" then change it to "being commited by your_name"
    • If the trunk status is "being committed by member_name", wait for the commit to complete and to to previous step.
  9. commit the trunk and when done, update the truck status to "commited by your_name"
  10. if this commit was worth recording, branch it in tags directory under a new release.


If you are having the "branch/project must be ancestrally related to trunk/project" error, try going into your trunk and right click > merge one file at a time. Make sure to click the "show log" button in the merge wizard to get the latest revision for the merge added for you.

Resources