Test commit
[cogito/jonas.git] / README
blob98d3f7a39dadc20c19d47ea51e9a9fb7cfaa9290
1 The Cogito Version Control System
2 =================================
4 Cogito is a version control system layered on top of the git tree history
5 storage system. It aims at seamless user interface and ease of use, providing
6 generally smoother user experience than the "raw" Core GIT itself and indeed
7 many other version control systems.
9 We shall first describe some quick ways to get started using Cogito, then go
10 over each available command one by one.
12 Please note that this document (meant to serve as a kind of Cogito tutorial
13 in the future) is quite sketchy so far; a much better starting tutorial might
14 be one of the Git Crash Courses featured at the Git homepage
15 (http://git.or.cz/). The reference documentation should be of pretty good
16 quality (see the 'Getting help' section at the bottom of this file).
18 You can find the Cogito homepage at http://git.or.cz/cogito/[].
21 Cogito is quite easy and intuitive to use. If you want to dive right in,
22 see cg-ref(7) for a quick commands/concepts reference and cg-help(1)
23 or cogito(7) for a reference manual.
27 Installing
28 ----------
30 If your distribution does not offer Cogito by itself, Cogito can be obtained as
31 a tarball from
33  - http://www.kernel.org/pub/software/scm/cogito/[]
35 Download and unpack the latest version, build with make, put the executables
36 somewhere in your `$PATH` (or add your Cogito directory itself to your `$PATH`),
37 and you're ready to go!
39 The following tools are vitally required by Cogito to do anything useful:
41 `-------------------------------`----------------------------------------------
42 Tool                            Description
43 -------------------------------------------------------------------------------
44 git-core                        Cogito is just a frontend for git.
45 bash                            All Cogito executables are scripted in bash.
46 sed, grep, textutils, etc.      The basic shell environment.
47 diff, patch                     The basic utilities for tracking file changes.
48 -------------------------------------------------------------------------------
50 The following tools are very recommended for regular Cogito operation:
52 `-------------------------------`----------------------------------------------
53 Tool                            Description
54 -------------------------------------------------------------------------------
55 curl                            For fetching files with the HTTP backend.
56 ssh                             For fetching files with the git+ssh backend.
57 -------------------------------------------------------------------------------
59 The following tools are optional but recommended:
61 `-------------------------------`----------------------------------------------
62 Tool                            Description
63 -------------------------------------------------------------------------------
64 rsync                           For fetching files with the rsync backend.
65 GNU coreutils                   The GNU versions of stat, date and cp \
66                                 are preferred over the BSD variants.
67 asciidoc (>= 7.0), xmlto        For building documentation.
68 -------------------------------------------------------------------------------
72 Getting started
73 ---------------
75 Starting a Fresh GIT Repository
76 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
78 If you want to start your own project using Cogito, there are two basic ways
79 to do this. You may start a fresh repository with no files in it, or you may
80 take an existing directory tree and turn it into a GIT repository.
82 Starting an Empty Repository
83 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
85 To create a new repository with no files in it, `cd` into an empty directory,
86 and give the following command:
88         $ cg-init
90 Your editor will start up, and you will be asked to type in the initial
91 commit description. Type something cute, and exit your editor.
93 That's it! You're now in your own GIT repository. Notice there is now a `.git`
94 directory. Go into it and look around, but don't change anything in there.
95 That's what Cogito commands are for.
97 Turning an Existing Directory Into a Repository
98 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
100 If you have a directory full of files, you can easily turn this into a
101 GIT repository. In fact, it is virtually the same as starting an empty
102 repository. Just `cd` into the directory you want converted into a GIT
103 repository, and give the following command:
105         $ cg-init
107 Your editor starts up, you type in an initial commit message, exit your
108 editor, and you're good to go. All of the files and directories within that
109 directory are now part of a GIT archive.
112 Accessing Someone Else's GIT Repository
113 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
115 Cloning the Repository
116 ^^^^^^^^^^^^^^^^^^^^^^
118 If you want to get started tracking an outside GIT repository, you first
119 must have Cogito's executables on your `$PATH`. Next, you need the URL (or
120 local directory path) of the repository you want to track. You can't just
121 use the URL of a tarball, like the one given above for the Cogito source.
122 The URL must point specifically to a `.git` directory somewhere. For instance,
123 the URL for Cogito's self-hosting repository is
125         http://www.kernel.org/pub/scm/cogito/cogito.git
127 Notice that the final directory, `cogito.git`, is not called `.git`. That is
128 fine. It still has the same content as your `.git` directory.
130 To clone the repository to your local filesystem, use the cg-clone command.
131 cg-clone can be told to create a new directory for your repository, or to
132 drop the repository into the current directory.
134 To have a new directory created, just invoke cg-clone with the URL.  You can
135 also include the directory in the command to specify exactly how should the
136 new directory be called, as follows:
138         $ cg-clone http://www.kernel.org/pub/scm/cogito/cogito.git cogitodir
140 You will watch a progressbar for a while and when it is over there will be a
141 new directory called 'cogitodir' (or whatever name you chose) in the current
142 directory. `cd` into it. Because we used the Cogito URL, you will see the
143 Cogito source tree, with its own `.git` directory keeping track of everything.
145 Note that the 'cogitodir' argument is optional; if you don't specify it,
146 cg-clone will automatically determine the directory name from the URL - it
147 would be 'cogito' for the URL we used. (Note that it's safe as cg-clone will
148 refuse to do anything if the directory already exists.)
150 If, instead, you want to clone the repository to the current directory,
151 first make sure you are in an empty directory. Then give the following
152 command:
154         $ cg-clone -s http://www.kernel.org/pub/scm/cogito/cogito.git
156 When you get your prompt back, do an ls to see the source tree and `.git`
157 directory.
159 Tracking Others' Work
160 ^^^^^^^^^^^^^^^^^^^^^
162 Of course, once you have cloned a repository, you don't just want to leave
163 it at that. The upstream sources are constantly being updated, and you want
164 to follow these updates. To do this, `cd` into the working tree directory (not
165 the `.git` directory, but the directory that contains the `.git` directory), and
166 give the following command:
168         $ cg-update
170 You don't use a URL anymore - Cogito knows which tree you're tracking, because
171 this information is stored in the `.git` directory. The above command will track
172 the 'origin' branch, which represents the repository you originally cloned.
173 But cg-update can be also used to track specific branches. See below for more
174 discussion of branches and how to track them.
176 When you give the above `cg-update` command, this performed two actions.
177 First, it fetched all new changes from the upstream repository into your
178 local repository. At that point, the changes exist in your local repository
179 as part of the project history. The changes themselves are not actually
180 visible in the files you see, but reside in the `.git` directory's awareness,
181 just downloaded and ready to be merged somewhere.  The second thing `cg-update`
182 does is to merge these changes into the files you see and work with. The end
183 result is that when the `cg-update` has finished, you will see all the
184 upstream changes reflected in your local files, and the `.git` directory will
185 be aware of the history of those changes as well.
187 It may be that you want to be aware of the history of the upstream work, but
188 you don't yet want those changes merged with your own local files. To do
189 this, give the following command:
191         $ cg-fetch
193 This does the first part of cg-update's job, but skips the second part.
194 Now your local files have not been changed, but your `.git` directory has been
195 updated with the history of all the changes that have occurred in the
196 upstream sources.
198 Using `cg-fetch` is useful for a variety of purposes, for instance if you want
199 to construct a diff against the latest version of the upstream sources, but
200 don't want those changes to disturb your ongoing work. `cg-fetch` will update
201 your `.git` directory with the history you need to construct your diff,
202 without merging that history into your tree, potentially breaking your
203 changes.
205 Typically, if you are not making changes to the project yourself, but just
206 want the latest version of a given project for your own use, you would use
207 `cg-update`. `cg-fetch` is strictly for development work.
209 Once you've done a `cg-fetch`, you may decide you want to merge after all. In
210 this case a `cg-update` command will do the trick, however you will also
211 update your local files with any further upstream changes that have occurred
212 since your `cg-fetch`. The alternative and more powerful way is using
213 the `cg-merge` command, which we shall describe later.
217 Using Cogito
218 ------------
220 If there are any changes, two IDs will be printed during `cg-fetch` or
221 `cg-update` run (I mean the line saying "Tree change"). Pass those as
222 parameters to cg-diff and you will get a diff describing changes from
223 the last time you fetched. You can also
225         $ cg-diff -r origin..HEAD
227 which will show changes between the cloned branch and your current branch
228 (shall you do any modifications).
230 Note that you can also access other branches than the one you clones from,
231 by adding it with the command
233         $ cg-branch-add name repourl
235 (the repourl can have a fragment part identifying a branch inside of the
236 repository). Then you can pass the 'name' to `cg-update` and `cg-fetch`
237 or use it anywhere where you could use the 'origin' name.
239 When you do some local changes, you can do
241         $ cg-diff
243 to display them.  Of course you will want to commit. If you added any new
244 files, do
246         $ cg-add newfile1 newfile2 ...
248 first. Then examine your changes by `cg-diff` or just list what files did you
249 change by
251         $ cg-status
253 and feel free to commit by the
255         $ cg-commit
257 command, which will present you with the editor of your choice for composing
258 the commit message. (`cg-commit` also has a very convenient command-line
259 usage.)
261 It is nice to be able to examine the commit history. We have tool for that too:
263         $ cg-log -r origin
265 will get you the history of the branch you cloned from. `cg-log` with no
266 arguments will default to the history of the current branch. Try also
267 prepending the `-c` and `-f` options. To only get a brief overview of the
268 changes, do
270         $ cg-log -s
273 Note that we gave only a glimpse to the basic usage, but there is a lot more
274 - merging (`cg-merge`), moving your tree to an older commit (`cg-seek`),
275 pushing (`cg-push`), etc.
278 Understanding Cogito branching and merging
279 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
281 Cogito's (partially inherited from GIT) concept of branching and merging may be
282 a little confusing at first, since it can be different from what you knew so far.
283 First, "branch" is too abstract word for us, so we will abandon it for now.
284 We will present two other key concepts instead:
286         - Repository - when you did `cg-clone` or `cg-init`, you created
287           a repository. That is a kind of container holding (usually) all your
288           history and data.
290         - Head - each repository has some heads available. Those are kind of
291           handles for various sequences of commit. A head contains simply a
292           pointer to the last commit in the sequence, and if you commit 'onto'
293           a head, the pointer will be advanced to the new commit. Your
294           "current" head is the one you are currently working on. It is
295           normally called 'master'.
297 Now let's take an hypothetical repository:
299         repository
300         +--------+
301         |  master<  heads (denoted by the '<')
302         |   unoji<
303         +--------+
305 Let's suppose that we want to fork off master's development. We have two
306 possibilities, either make new repository for it, or a new head.
308 Let's say that we want to fork it off for our work offline on a notebook,
309 so we will make it through cloning the repository to our notebook. What
310 will `cg-clone` do?
312         +--------+
313         +--------+
315 First it creates an empty repository
317         +--------+
318         $  origin<
319         +--------+
321 Then it creates an 'origin' head, and will copy all the history from the
322 remote repository's 'master' head there. So this head exists to reflect
323 the state of the remote repository. The important point is that it is
324 called 'origin' in our new repository, even through it corresponds to
325 a 'master' head in the old repository. This is normal - you can name your
326 local heads whatever you want.
328 The dollar sign denotes that this head is associated with a "remote branch"
329 - a source location of the head is saved somewhere and you can fetch the
330 head and possibly push to it.
332         +--------+
333         |  master<
334         $  origin<
335         +--------+
337 Finally it copied over the 'origin' head to the 'master' head, which will
338 from now as your current head represent your local development in the
339 repository.
341 So you do some local development, do few commits on the 'master' head and
342 want to catch up with the upstream repository. You use 'cg-update', but what
343 will it do?
345         +--------+
346         |  master<
347         $  origin<-F--- - - ... remote repository ...
348         +--------+
350 First, it will fetch: populate your 'origin' head with the new commits from
351 the remote's 'master' head.
353         +--------+
354         |  master<-M-.
355         $  origin>---'
356         +--------+
358 Then, it will merge those new commits to your 'master' head.
360 Now let's imagine that there is also another head 'unoji' on the other side
361 besides 'master', containing some cool commits not in 'master' (it has such an
362 exotic name, after all...). You want to merge its commits to your head too?
364         $ cg-branch-add r-unoji 'http://remote/repository#unoji'
365         $ cg-fetch r-unoji
367 will make your repository look like
369         +--------+
370         |  master<
371         $  origin<
372         $ r-unoji<
373         +--------+
375 with 'r-unoji' containing stuff from the remote's 'unoji' branch.
377 Ok, you did some development, but you decided not to merge it into upstream's
378 'master' yet since it is not yet stable enough. However, you want to upload it
379 into the upstream repository since it is public and you want people to be able
380 to try out your stuff. Easy, let's push it to a new head on the server.
382         $ cg-branch-add upmirror 'git+ssh://remote/repository#nislu'
384 will make your repository look like:
386         +--------+
387         |  master<
388         $  origin<
389         $ r-unoji<
390         $upmirror|
391         +--------+
393 Note that 'upmirror' has no head associated, it has just the "remote branch"
394 info. That is because it needs no head since it's solely for pushing. It is
395 however normal to have a head (frequently it's the 'origin') both for fetching
396 and pushing.
398         $ cg-push upmirror
400 will then make the remote repository look like:
402         +--------+
403         |  master<
404         |   unoji<
405         |   nislu<
406         +--------+
408 with 'nislu' on the remote side corresponding to the 'master' in your local
409 repository.
411 Ok, so this is how it goes for multiple repositories, where the cloned
412 repositories are essentially single branches. Note that if you clone the
413 repository locally, it can be actually very cheap, basically for free with
414 `cg-clone -l` (but please read its documentation).
416 But what if you still do not want multiple repositories? The key here is to
417 change your "current head" from 'master' to some new head, and then to be
418 able to switch back and forth:
420         $ cg-switch -c aspyk
422 to create a new 'aspyk' head (based on your current commit) and switch
423 to it, and
425         $ cg-switch master
427 to switch back to 'master' later, etc.
429 You can get the list of available heads by
431         $ cg-status -g
433 where the current head is marked by '>' and remote heads are marked by 'R'.
434 You can also get the list of source locations for remote heads by
436         $ cg-branch-ls
439 Using Cogito for team work
440 ~~~~~~~~~~~~~~~~~~~~~~~~~~
442 A small team with SSH access to a shared server can use Cogito in a way
443 similar to traditional CVS over SSH.
445 If you are bootstrapping the project, and you have a local Cogito working
446 copy, you must set up the shared repository and push a local head to it.
448 To set up the shared repository, for example in
450         remoteserver:/srv/git/projectname.git
452 login to the remote server and do:
454         $ mkdir /srv/git
455         $ cg-admin-setuprepo -g gitcommit /srv/git/projectname.git
457 Note: All the developers with "push" access must then obviously belong
458 to the 'gitcommit' group on the remote server.
460 Going back to your Cogito working copy, run:
462         $ cg-branch-add origin git+ssh://remoteserver/srv/git/project.git
463         $ cg-push
465 Now your other team members can start working with you, doing
467          $ cg-clone git+ssh://remoteserver/var/git/project.git
469 and when they are ready to push their work onto the shared repository,
470 they just do:
472          $ cg-update
473          $ cg-push
476 Cogito vs. other GIT tools
477 ~~~~~~~~~~~~~~~~~~~~~~~~~~
479 You can *MOSTLY* use Cogito in parallel with other GIT frontends (e.g. StGIT),
480 as well as the GIT plumbing and core GIT tools - the tools only need to keep
481 HEAD in place and follow the standardized `refs/` hierarchy. The only notable
482 exception is that you should stick with a single toolkit during a merge. Also,
483 you can't use `cg-update` and `cg-fetch` out of the box on repositories produced
484 by `git clone` since it uses incompatible branches representation.
488 Getting Help
489 ------------
491 Cogito commands come with their own documentation. To get quick usage help on
492 cg-fetch, for example, give this command:
494         $ cg-fetch --help
496 or, for a command's full reference manual, you can use either of these:
498         $ cg-fetch --long-help
499         $ cg-help cg-fetch
501 Alternatively, the man pages for the individual commands can be used as a
502 reference (their content is equivalent to the cg-help output).
503 cogito(7) is a good starting point.
505 You can ask thoughtful questions and make suggestions on the GIT mailing list:
507         git@vger.kernel.org
509 or (less preferably) contact the maintainer Petr Baudis <pasky@suse.cz>
510 directly.