소스 제어 메타 데이터없이 프로젝트의 작업 사본이 있습니다. 이제이 폴더에 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