* qq/maint: clone -q: honor "quiet" option over native transports. attribute documentation: keep EXAMPLE at end builtin-commit.c: Use 'git_config_string' to get 'commit.template' http.c: Use 'git_config_string' to clean up SSL config. diff.c: Use 'git_config_string' to get 'diff.external' convert.c: Use 'git_config_string' to get 'smudge' and 'clean' builtin-log.c: Use 'git_config_string' to get 'format.subjectprefix' and 'format.suffix' Documentation cvs: Clarify when a bare repository is needed Documentation: be precise about which date --pretty uses Conflicts: Documentation/gitattributes.txt
		
			
				
	
	
		
			202 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			202 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
gitcvs-migration(7)
 | 
						|
===================
 | 
						|
 | 
						|
NAME
 | 
						|
----
 | 
						|
gitcvs-migration - git for CVS users
 | 
						|
 | 
						|
SYNOPSIS
 | 
						|
--------
 | 
						|
git cvsimport *
 | 
						|
 | 
						|
DESCRIPTION
 | 
						|
-----------
 | 
						|
 | 
						|
Git differs from CVS in that every working tree contains a repository with
 | 
						|
a full copy of the project history, and no repository is inherently more
 | 
						|
important than any other.  However, you can emulate the CVS model by
 | 
						|
designating a single shared repository which people can synchronize with;
 | 
						|
this document explains how to do that.
 | 
						|
 | 
						|
Some basic familiarity with git is required. Having gone through
 | 
						|
linkgit:gittutorial[7] and
 | 
						|
linkgit:gitglossary[7] should be sufficient.
 | 
						|
 | 
						|
Developing against a shared repository
 | 
						|
--------------------------------------
 | 
						|
 | 
						|
Suppose a shared repository is set up in /pub/repo.git on the host
 | 
						|
foo.com.  Then as an individual committer you can clone the shared
 | 
						|
repository over ssh with:
 | 
						|
 | 
						|
------------------------------------------------
 | 
						|
$ git clone foo.com:/pub/repo.git/ my-project
 | 
						|
$ cd my-project
 | 
						|
------------------------------------------------
 | 
						|
 | 
						|
and hack away.  The equivalent of 'cvs update' is
 | 
						|
 | 
						|
------------------------------------------------
 | 
						|
$ git pull origin
 | 
						|
------------------------------------------------
 | 
						|
 | 
						|
which merges in any work that others might have done since the clone
 | 
						|
operation.  If there are uncommitted changes in your working tree, commit
 | 
						|
them first before running git pull.
 | 
						|
 | 
						|
[NOTE]
 | 
						|
================================
 | 
						|
The 'pull' command knows where to get updates from because of certain
 | 
						|
configuration variables that were set by the first 'git-clone'
 | 
						|
command; see `git config -l` and the linkgit:git-config[1] man
 | 
						|
page for details.
 | 
						|
================================
 | 
						|
 | 
						|
You can update the shared repository with your changes by first committing
 | 
						|
your changes, and then using the 'git-push' command:
 | 
						|
 | 
						|
------------------------------------------------
 | 
						|
$ git push origin master
 | 
						|
------------------------------------------------
 | 
						|
 | 
						|
to "push" those commits to the shared repository.  If someone else has
 | 
						|
updated the repository more recently, 'git-push', like 'cvs commit', will
 | 
						|
complain, in which case you must pull any changes before attempting the
 | 
						|
push again.
 | 
						|
 | 
						|
In the 'git-push' command above we specify the name of the remote branch
 | 
						|
to update (`master`).  If we leave that out, 'git-push' tries to update
 | 
						|
any branches in the remote repository that have the same name as a branch
 | 
						|
in the local repository.  So the last 'push' can be done with either of:
 | 
						|
 | 
						|
------------
 | 
						|
$ git push origin
 | 
						|
$ git push foo.com:/pub/project.git/
 | 
						|
------------
 | 
						|
 | 
						|
as long as the shared repository does not have any branches
 | 
						|
other than `master`.
 | 
						|
 | 
						|
Setting Up a Shared Repository
 | 
						|
------------------------------
 | 
						|
 | 
						|
We assume you have already created a git repository for your project,
 | 
						|
possibly created from scratch or from a tarball (see
 | 
						|
linkgit:gittutorial[7]), or imported from an already existing CVS
 | 
						|
repository (see the next section).
 | 
						|
 | 
						|
Assume your existing repo is at /home/alice/myproject.  Create a new "bare"
 | 
						|
repository (a repository without a working tree) and fetch your project into
 | 
						|
it:
 | 
						|
 | 
						|
------------------------------------------------
 | 
						|
$ mkdir /pub/my-repo.git
 | 
						|
$ cd /pub/my-repo.git
 | 
						|
$ git --bare init --shared
 | 
						|
$ git --bare fetch /home/alice/myproject master:master
 | 
						|
------------------------------------------------
 | 
						|
 | 
						|
Next, give every team member read/write access to this repository.  One
 | 
						|
easy way to do this is to give all the team members ssh access to the
 | 
						|
machine where the repository is hosted.  If you don't want to give them a
 | 
						|
full shell on the machine, there is a restricted shell which only allows
 | 
						|
users to do git pushes and pulls; see linkgit:git-shell[1].
 | 
						|
 | 
						|
Put all the committers in the same group, and make the repository
 | 
						|
writable by that group:
 | 
						|
 | 
						|
------------------------------------------------
 | 
						|
$ chgrp -R $group /pub/my-repo.git
 | 
						|
------------------------------------------------
 | 
						|
 | 
						|
Make sure committers have a umask of at most 027, so that the directories
 | 
						|
they create are writable and searchable by other group members.
 | 
						|
 | 
						|
Importing a CVS archive
 | 
						|
-----------------------
 | 
						|
 | 
						|
First, install version 2.1 or higher of cvsps from
 | 
						|
link:http://www.cobite.com/cvsps/[http://www.cobite.com/cvsps/] and make
 | 
						|
sure it is in your path.  Then cd to a checked out CVS working directory
 | 
						|
of the project you are interested in and run 'git-cvsimport':
 | 
						|
 | 
						|
-------------------------------------------
 | 
						|
$ git cvsimport -C <destination> <module>
 | 
						|
-------------------------------------------
 | 
						|
 | 
						|
This puts a git archive of the named CVS module in the directory
 | 
						|
<destination>, which will be created if necessary.
 | 
						|
 | 
						|
The import checks out from CVS every revision of every file.  Reportedly
 | 
						|
cvsimport can average some twenty revisions per second, so for a
 | 
						|
medium-sized project this should not take more than a couple of minutes.
 | 
						|
Larger projects or remote repositories may take longer.
 | 
						|
 | 
						|
The main trunk is stored in the git branch named `origin`, and additional
 | 
						|
CVS branches are stored in git branches with the same names.  The most
 | 
						|
recent version of the main trunk is also left checked out on the `master`
 | 
						|
branch, so you can start adding your own changes right away.
 | 
						|
 | 
						|
The import is incremental, so if you call it again next month it will
 | 
						|
fetch any CVS updates that have been made in the meantime.  For this to
 | 
						|
work, you must not modify the imported branches; instead, create new
 | 
						|
branches for your own changes, and merge in the imported branches as
 | 
						|
necessary.
 | 
						|
 | 
						|
If you want a shared repository, you will need to make a bare clone
 | 
						|
of the imported directory, as described above. Then treat the imported
 | 
						|
directory as another development clone for purposes of merging
 | 
						|
incremental imports.
 | 
						|
 | 
						|
Advanced Shared Repository Management
 | 
						|
-------------------------------------
 | 
						|
 | 
						|
Git allows you to specify scripts called "hooks" to be run at certain
 | 
						|
points.  You can use these, for example, to send all commits to the shared
 | 
						|
repository to a mailing list.  See linkgit:githooks[5].
 | 
						|
 | 
						|
You can enforce finer grained permissions using update hooks.  See
 | 
						|
link:howto/update-hook-example.txt[Controlling access to branches using
 | 
						|
update hooks].
 | 
						|
 | 
						|
Providing CVS Access to a git Repository
 | 
						|
----------------------------------------
 | 
						|
 | 
						|
It is also possible to provide true CVS access to a git repository, so
 | 
						|
that developers can still use CVS; see linkgit:git-cvsserver[1] for
 | 
						|
details.
 | 
						|
 | 
						|
Alternative Development Models
 | 
						|
------------------------------
 | 
						|
 | 
						|
CVS users are accustomed to giving a group of developers commit access to
 | 
						|
a common repository.  As we've seen, this is also possible with git.
 | 
						|
However, the distributed nature of git allows other development models,
 | 
						|
and you may want to first consider whether one of them might be a better
 | 
						|
fit for your project.
 | 
						|
 | 
						|
For example, you can choose a single person to maintain the project's
 | 
						|
primary public repository.  Other developers then clone this repository
 | 
						|
and each work in their own clone.  When they have a series of changes that
 | 
						|
they're happy with, they ask the maintainer to pull from the branch
 | 
						|
containing the changes.  The maintainer reviews their changes and pulls
 | 
						|
them into the primary repository, which other developers pull from as
 | 
						|
necessary to stay coordinated.  The Linux kernel and other projects use
 | 
						|
variants of this model.
 | 
						|
 | 
						|
With a small group, developers may just pull changes from each other's
 | 
						|
repositories without the need for a central maintainer.
 | 
						|
 | 
						|
SEE ALSO
 | 
						|
--------
 | 
						|
linkgit:gittutorial[7],
 | 
						|
linkgit:gittutorial-2[7],
 | 
						|
linkgit:gitcore-tutorial[7],
 | 
						|
linkgit:gitglossary[7],
 | 
						|
link:everyday.html[Everyday Git],
 | 
						|
link:user-manual.html[The Git User's Manual]
 | 
						|
 | 
						|
GIT
 | 
						|
---
 | 
						|
Part of the linkgit:git[1] suite.
 |