git을 백업 시스템으로 사용하는 것이 이상합니다. ./backup/myfiles 디렉토리가 있고 git을 사용하여 백업하고 싶다고 가정 해 봅시다. 일을 깨끗하게 유지하기 위해 myfiles 폴더에 .git 디렉토리를 갖고 싶지 않으므로 ./backup/git_repos/myfiles를 만들 수 있다고 생각했습니다. 자식 문서를 살펴보면서 이것을 시도했습니다.
$ 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
내가 도착한 오류 메시지를 볼 수 있습니다. 내가 뭘 잘못하고 있죠?
답변
git --git-dir=../repo --work-tree=. add foo
이것은 당신이 원하는 것을 할 것이지만 당신이 사용하는 모든 git 명령으로 그것을 지정해야 할 때 분명히 빨라질 것입니다.
당신은 내보낼 수 GIT_WORK_TREE=.
및 GIT_DIR=../backup
및 망할 놈의 각 명령에 그들을 데리러 것입니다. 그래도 쉘 당 하나의 저장소에서 편안하게 작업 할 수 있습니다.
차라리 .git 디렉토리를 다른 곳으로 심볼릭 링크하거나 기본 백업 디렉토리에서 .git 디렉토리로 심볼릭 링크를 만드는 것이 좋습니다.
답변
리포지토리가 작업 트리의 위치를 알고 있어야하며 그 반대도 마찬가지입니다.
작업 트리가있는 위치를 저장소에 알리려면 구성 값을 설정하십시오 core.worktree
. 작업 트리에 git 디렉토리의 위치를 알리려면 .git (폴더가 아닙니다!)라는 파일을 추가하고 다음과 같은 줄을 추가하십시오
gitdir: /path/to/repo.git
git 1.7.5부터 init 명령은 이에 대한 추가 옵션을 배웠습니다.
당신은 새로운 별도의 저장소를 초기화 할 수 있습니다
git init --separate-git-dir /path/to/repo.git
이것은 별도의 디렉토리에서 git 저장소를 초기화하고 .git 파일을 현재 디렉토리 (새 저장소의 작업 디렉토리)에 추가합니다.
1.7.5 이전에는 약간 다른 매개 변수를 사용하고 .git 파일을 직접 추가해야했습니다.
별도의 저장소를 초기화하기 위해 다음 명령은 작업 트리를 저장소와 연결합니다.
git --git-dir=/path/to/repo.git --work-tree=. init && echo "gitdir: /path/to/repo.git" > .git
현재 디렉토리는 작업 트리가되고 git은에 저장소를 사용합니다 /path/to/repo.git
. init 명령은 매개 변수 core.worktree
로 지정된 값을 자동으로 설정합니다 --git-dir
.
이것에 대한 별칭을 추가 할 수도 있습니다.
[alias]
initexternal = !"f() { git --work-tree=. --git-dir=\"$1\" init && echo \"gitdir: $1\" >> .git; }; f"
읽기 전용 작업 디렉토리에서 자식 버전 제어 사용
위의 지식을 통해 쓰기 권한없이 작업 디렉토리에 대한 git 버전 제어를 설정할 수도 있습니다. 중 하나를 사용하면 경우 --git-dir
모든 자식 명령 또는 (대신 작업 디렉토리의) 저장소 내에서 모든 명령을 실행, 당신은 .git 파일을 남길 수 있으므로 작업 디렉토리 내의 모든 파일을 만들 필요가 없습니다. 레오 답변 참조
답변
--separate-git-dir
에 대한 옵션 git init
(와 git clone
) 자식의 내 버전 (에이 작업을 수행하는 데 사용할 수 있습니다 1.7.11.3
). 이 옵션은 git 저장소를 작업 트리와 분리하고 작업 트리 .git
의 루트에 파일 시스템과 무관 한 git 기호 링크 (라는 파일 형식 )를 작성합니다. 결과는 niks의 대답 과 동일하다고 생각합니다 .
git init --separate-git-dir path/to/repo.git path/to/worktree
답변
나는 niks의 대답에 사용 된 --work-tree
및 --git-dir
디렉토리 를 뒤집는 것이 더 간단하다는 것을 알았습니다.
$ cd read_only_repos
$ git --work-tree=/some/readonly/location/foo/ --git-dir=foo init
$ cd foo
$ git status
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
.file_foo
bar
...
이 방법에는 두 가지 장점이 있습니다.
- 명령 줄 옵션이나
.git
파일이 없어도됩니다. 리포지토리의 루트 내에서만 정상적으로 작동합니다. - 파일 시스템을 소유하지 않아도 파일 시스템 버전을 지정할 수 있습니다. Git은 저장소 위치에만 쓸 것입니다.
내가 만난 유일한 경고는 .gitignore
파일 을 사용하는 대신 편집하는 것 info/exclude
입니다.
그런 다음 read_only_repos/foo
원래 파일의 버전이 제어되지 않더라도 저장소를 원격 저장소 로 원격으로 사용할 수 있습니다 .
답변
베어 트리 저장소와 같이 ‘.git’확장자를 가진 특이한 위치에 작업 트리가있는 git 저장소 인 디렉토리의 이름을 지정하는 것이 일반적입니다.
mkdir ../git_repos/myfiles.git
--work-tree
초기에 옵션을 제공했다면 core.worktree
git 변수를 자동으로 설정합니다. 즉, git 디렉토리를 지정하면 git이 작업 트리를 찾을 위치를 알 수 있습니다.
git --git-dir=../git_repos/myfiles.git --work-tree=. init
그러나 사실 후에도이 변수를 설정할 수 있습니다.
git --git-dir=../git_repos/myfiles.git config core.worktree "$(pwd)"
이 작업을 완료하면 add 명령이 예상대로 작동합니다.
git --git-dir=../git_repos/myfiles.git add foo
답변
git
저장소 내부에서 사용하십시오 .
cd ./backup/git_repos/myfiles
git init --bare
git config core.worktree ../myfiles
git config core.bare false
이제부터 환경 변수 나 추가 매개 변수를 설정하지 않고도 디렉토리 git
내부에서 사용할 수 있습니다 ./backup/git_repos/myfiles
.
답변
“nodgit”스크립트 (No Dot GIT)를 만들 수 있습니다.
#!/bin/sh
gits=/usr/local/gits
x=`pwd`
testdir() {( cd $1; pwd; )}
while [ "$x" != "/" ]; do
y=`echo $x|sed -e "s/\//__/g"`
if ([ -d "$gits/$y" ]); then
export GIT_DIR="$gits/$y"
export GIT_WORK_TREE="$x"
if ([ "$1" = "nodinit" ]); then
mkdir -p "$GIT_DIR"
git init --bare; exit $?
elif ([ "$1" = "shell" ]); then
bash; exit $?
else
exec git "$@"
fi
fi
x=`testdir "$x/.."`
done
git 대신 nodgit을 호출 할 수 있으며 git repo를 찾아 변수를 설정합니다. 예를 들어 / usr / local / gits / __ home__foo_wibbles에 (맨손) 저장소가 있고 / home / foo / wibbles / one에 있으면 올바른 작업 디렉토리 (/ home / foo / wibbles)와 저장소를 찾습니다. .
또한 “nodgit shell”을 사용하여 올바른 vars 세트가있는 쉘을 얻을 수 있으므로 일반 git 명령을 사용할 수 있습니다.