Can I store the .git folder outside the files I want tracked?
I have an unusual idea to use git as a backup system. So let's say I have a directory ./backup/myfiles and I want to back that up using git. To keep things clean I don't want to have a .git directory in the myfiles folder, so I thought I could create ./backup/git_repos/myfiles. From looking at the git docs, I've tried doing this:
$ cd backup/myfiles
$ mkdir ../git_repos/myfiles
$ git --git-dir=../git_repos/myfiles init
Initialized empty Git repository in backup/git_repos/myfiles/
$ git --git-dir="../git_repos/myfiles/" add foo
fatal: pathspec 'foo' did not match any files
You can see the error message I get there. What am I doing wrong?
git --git-dir=../repo --work-tree=. add foo
This will do what you want but will obviously suck when you have to specify it with every git command you ever use.
You can export GIT_WORK_TREE=.
and GIT_DIR=../backup
and Git will pick them up on each command. That will only comfortably allow you to work in a single repository per shell, though.
I'd rather suggest symlinking the .git directory to somewhere else, or creating a symlink to the .git directory from your main backup directory.
You just need to ensure that the repository knows where the work tree is and vice versa.
To let the repository know where the work tree is, set the configuration value core.worktree
. To let the work tree know where it's git directory is, add a file named .git (not a folder!) and add a line like
gitdir: /path/to/repo.git
Since git 1.7.5 the init command learned an extra option for this.
You can initialize a new separate repository with
git init --separate-git-dir /path/to/repo.git
This will initialize the git repository in the separate directory and add the .git file in the current directory, which is the working directory of the new repository.
Previously to 1.7.5 you had to use slightly different parameters and add the .git file yourself.
To initialize a separate repository the following command links the work-tree with the repository:
git --git-dir=/path/to/repo.git --work-tree=. init && echo "gitdir: /path/to/repo.git" > .git
Your current directory will be the working tree and git will use the repository at /path/to/repo.git
. The init command will automatically set the core.worktree
value as specified with the --git-dir
parameter.
You could even add an alias for this:
[alias]
initexternal = !"f() { git --work-tree=. --git-dir="$1" init && echo "gitdir: $1" >> .git; }; f"
Use git version control on a read-only working directory
With the knowledge above, you can even set up git version control for an working directory without having write permissions. If you either use --git-dir
on every git command or execute every command from within the repository (instead of the working directory), you can leave out the .git file and therefore do not need to create any files within the working directory. See also Leos answer
The --separate-git-dir
option for git init
(and git clone
) can be used to accomplish this on my version of git ( 1.7.11.3
). The option separates the git repository from the work tree and creates a filesystem agnostic git symbolic link (in the form of a file named .git
) in the root of the work tree. I think the result is identical to niks' answer.
git init --separate-git-dir path/to/repo.git path/to/worktree
链接地址: http://www.djcxy.com/p/412.html
上一篇: 在Git存储库中查找和恢复已删除的文件