.git 폴더를 추적할 파일 외부에 저장할 수 있습니까?
저는 Git을 백업 시스템으로 사용하는 특이한 아이디어가 있습니다.예를 들어 디렉토리 ./backup/myfiles가 있는데 git를 사용하여 백업하려고 합니다.깨끗한 상태를 유지하기 위해 myfiles 폴더에 .git 디렉터리를 두고 싶지 않아서 ./backup/git_repos/myfiles를 만들 수 있다고 생각했습니다.Git 문서를 보면, 저는 이것을 시도해 보았습니다.
$ 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
오류 메시지가 표시됩니다.내가 뭘 잘못하고 있는 거지?
리포지토리가 작업 트리의 위치를 알고 있고 그 반대의 경우도 마찬가지입니다.
값을 합니다.core.worktree
.이름의 !)을하고 "."과 같은 줄을 추가합니다.
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
는 현재디리가되작고가저사장다용소니에 있는 합니다./path/to/repo.git
를 자동으로 합니다.core.worktree
으로 된 값--git-dir
매개 변수
이에 대한 별칭을 추가할 수도 있습니다.
[alias]
initexternal = !"f() { git --work-tree=. --git-dir=\"$1\" init && echo \"gitdir: $1\" >> .git; }; f"
읽기 전용 작업 디렉토리에서 git 버전 제어 사용
위의 지식을 바탕으로 쓰기 권한 없이 작업 디렉터리에 대한 git 버전 제어를 설정할 수도 있습니다.다음 중 하나를 사용하는 경우--git-dir
모든 git 명령어에서 또는 저장소(작업 디렉토리 대신) 내의 모든 명령어를 실행하면 .git 파일을 생략할 수 있으므로 작업 디렉토리 내에 파일을 만들 필요가 없습니다.참고 항목레오 응답
git --git-dir=../repo --work-tree=. add foo
이것은 당신이 원하는 것을 할 것이지만 당신이 사용하는 모든 git 명령으로 그것을 지정해야 할 때 분명히 형편없을 것입니다.
를 내보낼 수 .GIT_WORK_TREE=.
그리고.GIT_DIR=../backup
각 명령에 따라 Git가 그들을 픽업할 것입니다.그러나 셸당 하나의 저장소에서만 작업할 수 있습니다.
.git 디렉터리를 다른 곳으로 심볼릭 연결하거나 기본 백업 디렉터리에서 .git 디렉터리로 심볼릭 링크를 만드는 것이 좋습니다.
그--separate-git-dir
을 선택할 수 .git init
)git clone
)는 내 의 git하는 데 할 수 1.7.11.3
. . 저장소를 .git
)이(가) 작업 트리의 루트에 있습니다.저는 그 결과가 niks의 답변과 동일하다고 생각합니다.
git init --separate-git-dir path/to/repo.git path/to/worktree
저는 그것을 뒤집는 것이 더 간단하다고 생각합니다.--work-tree
그리고.--git-dir
niks의 답변에 사용된 디렉토리:
$ 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
...
이 접근 방식에는 두 가지 이점이 있습니다.
- 이나 명행옵필요없가습니다사용션할을령-▁any▁or▁the▁to▁▁it
.git
파일. 저장소 루트 내에서 정상적으로 작동합니다. - 파일 시스템을 소유하지 않은 경우에도 버전을 지정할 수 있습니다.Git는 리포지토리 위치에만 씁니다.
내가 마주친 유일한 경고는 사용하는 대신.gitignore
은 일파, 집편을 편집합니다.info/exclude
.
저장소를 할 수 .read_only_repos/foo
원본 파일이 버전 제어 하에 있지 않은 경우에도 자신의 리포지토리에 원격으로 저장할 수 있습니다.
일반적으로 디렉터리 이름을 지정하는 것은 일반적으로 git 저장소와 마찬가지로 확장명이 '.git'인 비정상적인 위치에 작업 트리가 있는 git 저장소입니다.
mkdir ../git_repos/myfiles.git
만약 당신이 그것을 제공했다면.--work-tree
으로 init ▁the▁option다▁at▁automatic▁haveally를 설정할 수 있습니다.core.worktree
git 디렉토리를 지정하면 git가 작업 트리를 찾을 위치를 알게 된다는 것을 의미하는 config 변수입니다.
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에 (맨) repo가 있고 /home/foo/wibbles/one에 있다고 가정하면 올바른 작업 디렉토리(/home/foo/wibbles)와 repo가 검색됩니다.
또한 "nodgit shell"을 사용하여 일반 기존 git 명령을 사용할 수 있도록 올바른 변수 세트가 있는 셸을 가져올 수 있습니다.
두 위해 에 다른할 수 .core.worktree
다른깃 저장소 폴더를 빵 수 ().--separate-git-dir
, ). 그.core.worktree
옵션에는 브레드 크럼 파일이 필요하지 않으며 첫 번째 릴리스부터 git의 기능이었습니다.두 번째 옵션은 최신 버전이며 브레드 크럼 파일이 필요하지만 저장소 구성 파일을 변경할 필요는 없습니다.
옵션 1: 코어.작업용 나무
하고자 저장소 및 core.worktree
추적할 경로로 이동합니다.터미널 명령을 사용하여 이 값을 설정하거나 추가할 리포지토리 구성 파일을 직접 편집할 수 있습니다.
worktree = <path to files to backup>
리포지토리 폴더를 이 경로의 하위 폴더로 만들지 마십시오. 재귀적입니다.당신은 이것을 시도해보고 단순히 저장소 폴더를 무시할 수도 있지만, 나는 git이 이 시나리오를 허용하지 않을 것이라고 생각합니다.
의 경우,은 당의경우는은, 신당신으로 갈입니다.backup/git_repos/
운영하기 위해init
할 수 .--git-dir=./myfiles
기본 리포지토리 폴더 이름을 재정의하는 옵션입니다.명령은 다음과 같습니다.
cd backup/git_repos
git init --git-dir=./myfiles
git config core.worktree backup/myfiles
참고 1: Git의 최신 추가 작업 트리 기능과는 다릅니다.이 트리는 베어되지 않은 모든 리포지토리에서 사용되는 기본 작업 트리입니다.이러한 추가 작업 트리는 아래의 옵션 2와 마찬가지로 Git 저장소 폴더의 하위 폴더에 빵가루를 사용합니다.
참고 2: 최근에 Windows용 Git GUI를 많이 테스트했는데 Git Extensions만이 코어 사용을 지원합니다.주 작업 트리를 이동하는 작업 트리입니다.
코어를 지원하지 않는 GUI.작업용 나무
소스 트리, 포크, 타워, 깃크라켄, 깃허브 데스크톱, 깃어헤드, 스마트깃* 및 깃콜라.코어를 사용할 때 단말기를 고수하고 싶을 것입니다.작업용 나무
은 이 하며 SmartGit을 하고 있습니다..git
파일. 코어에 필요하지 않습니다.작업용 나무
옵션 2: --separate-git-dir
백업할 에서 저할백업초를 합니다.--separate-git-dir=<path to hold repository data>
하고 "" " " " " " " 를 합니다..git
다음과 같은 행이 포함된 초기화 위치의 파일:
gitdir: <path to hold repository data>
명령은 다음과 같습니다.
cd backup/myfiles
git init --separate-git-dir=backup/git_repos/myfiles/
그리고 당신의.git
줄을 지어 들어가다backup/myfiles/
을 합니다.gitdir: backup/git_repos/myfiles/
를위 이제처는리 GIT작다의 합니다..git
마치 저장소 위치인 것처럼 파일을 저장합니다.
다음과 같이 가정합니다.myfiles
디렉터리가 이미 존재하고 일부 콘텐츠가 있습니다. 다음과 같이 사용할 수 있습니까?
cd ~/backup
git init
git add myfiles
그.git
디렉토리는 다음 위치에 있을 것입니다.backup
에 없는myfiles
.
다음과 같은 스크립트를 만듭니다.
~/bin/git-timeout:
#!/usr/bin/sh
export GIT_DIR=/home/Version-Control/cygwin-root.git/
export GIT_WORK_TREE=/
git --git-dir=$GIT_DIR --work-tree=$GIT_WORK_TREE "$@"
exit $?
--git_message=$를 사용하는 것은 중복됩니다.GIT_DIR이지만 스크립트 외부에서도 환경 변수를 설정할 수 있습니다.
위의 예는 cygwin 시스템 파일에 대한 로컬 변경사항을 추적하기 위한 것입니다.
이것이 필요한 주요 프로젝트에 대해 하나의 스크립트를 만들 수 있지만, /.git 없이 /가 주요 용도입니다.
이중화를 제거하면 셸 별칭이나 함수를 만들 수 있을 정도로 위의 값은 작습니다.
이 작업을 자주 수행하면 워크스페이스에서 저장소로의 매핑을 복원할 수 있습니다.
"Boxes, Links, and Parallel Trees: Elements of a Configuration Management System",
in Workshop Proceedings of the Software Management Conference. 1989.
가장 가까운 현대적인 상대는 Perforce 매핑 또는 뷰로, 부분 체크아웃 및 작업영역 및 레포의 비코로케이션을 지원합니다.
언급URL : https://stackoverflow.com/questions/505467/can-i-store-the-git-folder-outside-the-files-i-want-tracked
'IT' 카테고리의 다른 글
model.find()가 mongoose에서 비어 있음을 반환합니다. (0) | 2023.06.27 |
---|---|
긴 줄에 gitdiff를 어떻게 사용해야 합니까? (0) | 2023.06.27 |
MongoDB 대량 입력 대 대량 입력 (0) | 2023.06.27 |
Android "뷰 계층 구조를 만든 원본 스레드만 뷰를 터치할 수 있습니다." (0) | 2023.06.27 |
mongodb 및 C# 단위 작업 (0) | 2023.06.27 |