소스 제어 메타 데이터없이 프로젝트의 작업 사본이 있습니다. 이제이 폴더에 git-clone과 동등한 작업을 수행하고 로컬 변경 사항을 유지하고 싶습니다.
git-clone을 사용하면 기존 폴더로 복제 할 수 없습니다. 가장 좋은 방법은 무엇입니까?
소스 제어 메타 데이터없이 프로젝트의 작업 사본이 있습니다. 이제이 폴더에 git-clone과 동등한 작업을 수행하고 로컬 변경 사항을 유지하고 싶습니다.
git-clone을 사용하면 기존 폴더로 복제 할 수 없습니다. 가장 좋은 방법은 무엇입니까?
답변:
새 디렉토리로 복제 한 다음 .git
디렉토리를 기존 디렉토리로 됩니다.
기존 디렉토리의 이름이 "code"인 경우
git clone https://myrepo.com/git.git temp
mv temp/.git code/.git
rm -rf temp
또한 clone 명령 중에 체크 아웃하지 않고도 수행 할 수 있습니다. 자세한 내용은 여기를 참조하십시오 .
git clone
첫 번째 명령으로 사용 하는 한 더 이상 체크 아웃 명령이 필요하지 않습니다. git clone --no-checkout
그 첫 번째 단계 와 같은 것을 대신 사용하는 경우 .git 디렉토리가 이동 한 후 git reset HEAD
파일을 삭제하지 않았다는 것을 git에 알려 주어야합니다.
git status
.
복제하지 말고 대신 가져 오십시오. 레포에서 :
git init
git remote add origin $url_of_clone_source
git fetch origin
git checkout -b master --track origin/master # origin/master is clone's default
그런 다음 트리를 재설정하여 원하는 커밋을 얻을 수 있습니다.
git reset origin/master # or whatever commit you think is proper...
그리고 당신은 복제 한 것 같습니다.
여기서 흥미로운 질문 (그리고 답이없는 질문) : 벌거 벗은 나무가 어느 커밋을 기반으로했는지, 따라서 어떤 위치로 재설정하는지 찾는 방법.
다음은 기존 디렉토리에서 마스터 분기를 체크 아웃하기 위해 수행 한 것입니다.
git init
git remote add origin [my-repo]
git fetch
git checkout origin/master -ft
-t
깃발이 왜 여기에 사용 되는지 설명 할 수 있습니까 ?
나는 거라고 git clone
새로운 디렉토리에 새 복제에 기존 디렉토리의 내용을 복사합니다.
git clone wherever tmp && git mv tmp/.git . && rm -rf tmp
즉, .git
임시 복제본 에서 디렉토리를 이동하면 복제본의 작업 트리를 정리하고 기존 파일을 복사하는 것보다 간단합니다.
git mv tmp/.git .
돌아옵니다 fatal: cannot move directory over file, source=tmp/.git, destination=.git
. 문제가 무엇인지 아는 사람이 있습니까?
mv
하지 않아야합니다 git mv
. 비록 이것이 왜 .git
파일이 이미 있는지 설명하지는 않지만 ( gitdir: some/path/to/a/git-dir
, "gitfile"을 포함 하고 있지 않다면 fatal: Not a git repository (or any of the parent directories): .git
대신 보았을 것입니다).
임시 디렉토리를 사용하는 것은 좋지만 해당 단계를 피하려는 경우 작동합니다. 작업 디렉토리의 루트에서 :
$ rm -fr .git
$ git init
$ git remote add origin your-git-url
$ git fetch
$ git reset --mixed origin/master
git reset --hard origin/master
로컬 파일을 제거합니다.
hard
하고 mixed
혼합 로컬 변경 사항을 유지하는 것입니다 (나중에는 예를 들어 보여주지 끌어하려고 그렇다면 : 당신은 unstaged 변경 사항이 커밋하거나 숨기고하시기 바랍니다 REBASE로 끌어 할 수 없습니다. ) hard는 이러한 로컬 변경 사항을 폐기합니다
git clone your_repo tmp && mv tmp/.git . && rm -rf tmp && git reset --mixed
git reset --hard
하면 로컬 파일 변경 사항이 적용됩니다. 특히이 OP가 요청한 내용이 아닙니다. --mixed
대신 사용해야합니다.
빈 저장소로 git repo를 복제하려면 다음을 수행하십시오.
cd myfolder
git clone https://myrepo.com/git.git .
주목 .
당신의 마지막 git clone
명령. 그러면 현재 작업 디렉토리에 저장소가 다운로드됩니다.
fatal: destination path '.' already exists and is not an empty directory.
이에 대한 두 가지 접근 방식이 있습니다. 가능한 경우 새 git 작업 디렉토리의 깨끗한 폴더로 시작한 다음 나중에 버전을 복사합니다. 이것은 다음과 같이 보일 수 있습니다 * :
mv $dir $dir.orig
git clone $url $dir
rsync -av --delete --exclude '.git' $dir.orig/ $dir/
rm -rf $dir.orig
이 시점에서 이전 작업 폴더를 현재 작업 디렉토리로 사용하여 매우 깨끗한 작업 복사본이 있어야 파일을 포함한 변경 사항을 실행할 경우 레이더에 변경 사항이 표시됩니다 git status
.
반면에 실제로 다른 방법으로해야한다면 다음과 같은 결과를 얻을 수 있습니다.
cd $dir
git clone --no-checkout $url tempdir
mv tempdir/.git .
rmdir tempdir
git reset --mixed HEAD
어느 쪽이든, 내가 할 첫 번째 일은 git stash
모든 로컬 변경 사항을 따로 보관하는 것과 같이 실행하는 것입니다. 그런 다음 다시 적용하고 커밋하려는 변경 사항을 적용 할 수 있습니다.
* 두 예제 모두 프로젝트의 상위 디렉토리에있는 쉘에서 시작한다고 가정합니다.
이것은 내가 만난 모든 방법 중 최고입니다.
저장소의 .git 폴더 (이미있는 파일 제외 existing-dir
) 만 빈 임시 디렉토리로 복제하십시오.
git clone --no-checkout repo-path-to-clone existing-dir/existing-dir.tmp
// 로컬 리포지토리 복제를위한-하드 링크 없음.git 폴더를 파일이있는 디렉토리로 이동하십시오. 이것은 existing-dir
자식 저장소를 만듭니다 .
mv existing-dir/existing-dir.tmp/.git existing-dir/
임시 디렉토리를 삭제하십시오.
rmdir existing-dir/existing-dir.tmp
cd existing-dir
Git은 모든 파일이 삭제되었다고 생각합니다. 이렇게하면 저장소의 상태가 HEAD로 되돌아갑니다.
경고 : 파일에 대한 로컬 변경 사항이 손실됩니다.
git reset --mixed HEAD
당신이 (가르쳐 적어도 자식 1.7.7 사용하는 경우 옵션), 작업 사본에 현재 디렉토리를 설정합니다 :clone
--config
git clone example.com/my.git ./.git --mirror --config core.bare=false
이것은 다음에 의해 작동합니다.
.git
폴더 로 복제--mirror
같은 순수 메타 데이터 폴더에 새 복제를 만드는 .git
필요로--config core.bare=false
암시 적 countermands bare=true
의 --mirror
하여 저장소 관련 작업 디렉토리를 가지고 정상적인 복제처럼 행동 할 수 있도록 옵션.git
메타 데이터 디렉토리가 이미 작업 사본으로 바꾸려는 디렉토리에 존재 하는 경우에는 작동하지 않습니다 .
[core]
모두 포함 로컬 설정의 섹션 bare = true
과 bare = false
. 더 문제가되는 부분은 포함 origin
된 [remote "origin"]
섹션 mirror = true
과 페치 스펙과 함께 리모트에 대해 잘못된 값을 가질 수 있다는 것입니다. 작업 사본에서는 제대로 작동하지 않습니다. 이러한 문제를 해결 한 후 정상적으로 복제하고 새 작업 사본을 이동하는 .git
것이 더 효율적입니다.
다음 명령 줄을 재귀 적으로 입력하면됩니다.
mkdir temp_dir // Create new temporary dicetory named temp_dir
git clone https://www...........git temp_dir // Clone your git repo inside it
mv temp_dir/* existing_dir // Move the recently cloned repo content from the temp_dir to your existing_dir
rm -rf temp_dir // Remove the created temporary directory