추적하려는 파일 외부에 .git 폴더를 저장할 수 있습니까? 유지하기 위해 myfiles 폴더에

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.worktreegit 변수를 자동으로 설정합니다. 즉, 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 명령을 사용할 수 있습니다.