기존 폴더에“git clone”하는 가장 좋은 방법은 무엇입니까?


479

소스 제어 메타 데이터없이 프로젝트의 작업 사본이 있습니다. 이제이 폴더에 git-clone과 동등한 작업을 수행하고 로컬 변경 사항을 유지하고 싶습니다.

git-clone을 사용하면 기존 폴더로 복제 할 수 없습니다. 가장 좋은 방법은 무엇입니까?


4
더 나은 토론은 여기에 있습니다 .
cdunn2001

1
@MEM이 답변 더 좋아 I,하지만 작품 ... 중 stackoverflow.com/a/5377989/11236
ripper234

2
@ ripper234-그렇습니다. 나는 같은 상황에 있었고 방금 그 단계를 수행했지만 아무런 문제가 없었습니다. 모두 깨끗하고 훌륭합니다. 나는 당신이 말한대로 선호도, 결론은 두 가지 모두 작동한다고 생각합니다. 건배.
MEM

1
이를 달성 할 수있는 확실한 방법이 없기 때문에 미친 것이므로, 공유기를 마운트 된 공유 폴더에 복제 할 때 유용합니다.
Thomas Decaux

답변:


558

새 디렉토리로 복제 한 다음 .git 디렉토리를 기존 디렉토리로 됩니다.

기존 디렉토리의 이름이 "code"인 경우

git clone https://myrepo.com/git.git temp
mv temp/.git code/.git
rm -rf temp

또한 clone 명령 중에 체크 아웃하지 않고도 수행 할 수 있습니다. 자세한 내용은 여기를 참조하십시오 .


25
이것은 @ChrisJohnsen이 의견에 남겼다는 제안입니다. 나는 그것이 유용하다는 것을 알았고 그것을 실제 답으로 만들고 싶었다. 크리스, 대답을 마치면이 질문을 기꺼이 삭제하겠습니다.
amicitas

2
감사! "git checkout-"과 같은 단계가 누락되었지만 모든 파일이 삭제 된 것 같아요?
mrooney

2
아니요, git clone첫 번째 명령으로 사용 하는 한 더 이상 체크 아웃 명령이 필요하지 않습니다. git clone --no-checkout그 첫 번째 단계 와 같은 것을 대신 사용하는 경우 .git 디렉토리가 이동 한 후 git reset HEAD파일을 삭제하지 않았다는 것을 git에 알려 주어야합니다.
amicitas

3
나는 세 번째 단계로이를 추가 : MV 온도 / .gitignore 코드 / .gitignore
다니엘 아란

1
@KalpeshSoni, 예 git은 수정 된 파일에 대해 알고 있으며 일반적인 git 명령 (예 :)을 사용하여 변경 사항을 볼 수 있습니다 git status.
amicitas

284

복제하지 말고 대신 가져 오십시오. 레포에서 :

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...

그리고 당신은 복제 한 것 같습니다.

여기서 흥미로운 질문 (그리고 답이없는 질문) : 벌거 벗은 나무가 어느 커밋을 기반으로했는지, 따라서 어떤 위치로 재설정하는지 찾는 방법.


7
github 설정에 대한 팬이 아닙니다. "팁 : 자격 증명 도우미는 HTTPS 리포지토리 URL을 복제 할 때만 작동합니다." 나는 자격 증명 도우미를 사용하고 있었고 이것은 길고 과일이없는 토끼 구멍을 보냈습니다.
앤드류

5
'git checkout --track origin / master'대신 'git checkout -track origin / master'대신 잘 작동합니다. 재설정이 필요하지 않습니다.
felipecrp

1
"Git error : 다음 추적되지 않은 작업 트리 파일을 체크 아웃으로 덮어 씁니다"라는 오류가 발생하여이 명령을 추가합니다. git clean -d -fx ""
shakaran

1
모든 상황에서 권장되는 것은 아니지만 이것이 바로 내가 필요한 것입니다.
Chaim Eliyah

1
@AndreasKrey 귀하의 원래 답변 (편집 기록으로 이동 한)은 질문 (및 저)에 필요한 것을 정확하게 수행합니다. -f를 사용하지 않고 체크 아웃시 변경된 답변 barfs는 로컬 변경 사항을 버리고 내가 원하지 않는 것 입니다. 내가 당신이라면 나는 당신의 원래의 대답으로 돌아가는 것을 고려할 것입니다.
Ajean

77

다음은 기존 디렉토리에서 마스터 분기를 체크 아웃하기 위해 수행 한 것입니다.

git init
git remote add origin [my-repo]
git fetch
git checkout origin/master -ft

2
이것은 훌륭한 답변이며 파일 시스템 finagling을 피합니다.
user151841

1
이것은 해킹이 아니기 때문에 허용되는 답변이어야합니다.
php_nub_qq

5
실제로 이것은 OP (및 나) 원하지 않는 것을 정확하게 수행 하여 로컬 변경 사항을 덮어 씁니다.
Ajean

저의 공감대는 이것이 ME에 도움이되었지만 OP의 질문에 대한 최선의 답변이 아니라는 것을 나타냅니다.
TecBrat

2
누군가 -t깃발이 왜 여기에 사용 되는지 설명 할 수 있습니까 ?
jfowkes

38

나는 거라고 git clone새로운 디렉토리에 새 복제에 기존 디렉토리의 내용을 복사합니다.


4
그렇게 할 경우, 매우 신중하게 커밋하기 전에 diff를 검토해야합니다. 정보가 충분하지 않기 때문에 작업 복사본을 얻을 때마다 소스 리포지토리에서 변경 한 내용을 실수로 되돌릴 수있는 절대적인 클래식 사례입니다. 변경 사항을 시작하기 전의 변경 사항과 변경 사항을 시작하기 전에 수행 한 변경 사항을 파악하고 리포지토리의 다른 변경 사항과 병합하기 위해 작업 복사본에서. 나는 이런 상황에서 이런 일이 계속 반복되는 것을 보았습니다. 제가 저 자신과 함께 일하는 사람들과 제가 그 일을 "강하게 낙담"시켰습니다.
벤 Clifford

72
git clone wherever tmp && git mv tmp/.git . && rm -rf tmp즉, .git임시 복제본 에서 디렉토리를 이동하면 복제본의 작업 트리를 정리하고 기존 파일을 복사하는 것보다 간단합니다.
크리스 존슨

1
@ChrisJohnsen : 당신은 그것을 대답으로 만들었을 것입니다. 그것은 확실히 그것을 할 수있는 가장 좋은 방법입니다
Stefano

2
@ChrisJohnsen이 git mv tmp/.git .돌아옵니다 fatal: cannot move directory over file, source=tmp/.git, destination=.git. 문제가 무엇인지 아는 사람이 있습니까?
데니스

6
@Dennis, 오타입니다. 해당 명령은 평범 mv하지 않아야합니다 git mv. 비록 이것이 왜 .git파일이 이미 있는지 설명하지는 않지만 ( gitdir: some/path/to/a/git-dir, "gitfile"을 포함 하고 있지 않다면 fatal: Not a git repository (or any of the parent directories): .git대신 보았을 것입니다).
Chris Johnsen

34

임시 디렉토리를 사용하는 것은 좋지만 해당 단계를 피하려는 경우 작동합니다. 작업 디렉토리의 루트에서 :

$ rm -fr .git
$ git init
$ git remote add origin your-git-url
$ git fetch
$ git reset --mixed origin/master

20
git reset --hard origin/master로컬 파일을 제거합니다.
Mouad Debbar

1
이미 위에서 지적한 무슨에 차이를 추가 hard하고 mixed혼합 로컬 변경 사항을 유지하는 것입니다 (나중에는 예를 들어 보여주지 끌어하려고 그렇다면 : 당신은 unstaged 변경 사항이 커밋하거나 숨기고하시기 바랍니다 REBASE로 끌어 할 수 없습니다. ) hard는 이러한 로컬 변경 사항을 폐기합니다
aexl

리모콘의 철자가 잘못되었습니다.
Glenn Dayton

10
git clone your_repo tmp && mv tmp/.git . && rm -rf tmp && git reset --mixed

7
를 사용 git reset --hard하면 로컬 파일 변경 사항이 적용됩니다. 특히이 OP가 요청한 내용이 아닙니다. --mixed대신 사용해야합니다.
Caleb

4

빈 저장소로 git repo를 복제하려면 다음을 수행하십시오.

cd myfolder
git clone https://myrepo.com/git.git . 

주목 .당신의 마지막 git clone명령. 그러면 현재 작업 디렉토리에 저장소가 다운로드됩니다.


4
fatal: destination path '.' already exists and is not an empty directory.
Roland Kofler

디렉토리는 비어 있어야합니다.
okTalk

4
OP는 기존 프로젝트에 복제하는 방법을 묻고 git clone이 불평한다고 말합니다. 나쁜 대답입니다.
mix3d 2016 년

이것은 새로운 디렉토리를 생성 할 때만 작동합니다. "git init"를 사용하지 않고 위의 명령을 실행하십시오
Bilal Ahmed

3

OP가 요청한 방식으로 이미 많은 답변을 받았습니다. 그러나 반대 방향으로 수행하는 것이 훨씬 간단하다는 점은 주목할 가치가 있습니다.

git clone repo-url tmp/
cp -R working/ tmp/

이제 원하는 대상 상태 (새 클론 + 로컬 변경)가 있습니다.


2

이에 대한 두 가지 접근 방식이 있습니다. 가능한 경우 새 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모든 로컬 변경 사항을 따로 보관하는 것과 같이 실행하는 것입니다. 그런 다음 다시 적용하고 커밋하려는 변경 사항을 적용 할 수 있습니다.

* 두 예제 모두 프로젝트의 상위 디렉토리에있는 쉘에서 시작한다고 가정합니다.


2

이것은 내가 만난 모든 방법 중 최고입니다.

저장소의 .git 폴더 (이미있는 파일 제외 existing-dir) 만 빈 임시 디렉토리로 복제하십시오.

  1. git clone --no-checkout repo-path-to-clone existing-dir/existing-dir.tmp // 로컬 리포지토리 복제를위한-하드 링크 없음

.git 폴더를 파일이있는 디렉토리로 이동하십시오. 이것은 existing-dir자식 저장소를 만듭니다 .

  1. mv existing-dir/existing-dir.tmp/.git existing-dir/

임시 디렉토리를 삭제하십시오.

  1. rmdir existing-dir/existing-dir.tmp

  2. cd existing-dir

Git은 모든 파일이 삭제되었다고 생각합니다. 이렇게하면 저장소의 상태가 HEAD로 되돌아갑니다.

경고 : 파일에 대한 로컬 변경 사항이 손실됩니다.

  1. git reset --mixed HEAD

1
이 작업을 수행해야하는 경우의 99 %에서 하드 리셋이 원하지 않는 것처럼 보입니다.
Stefan Fabian

0

당신이 (가르쳐 적어도 자식 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메타 데이터 디렉토리가 이미 작업 사본으로 바꾸려는 디렉토리에 존재 하는 경우에는 작동하지 않습니다 .


1
이 기술은 결과 않습니다 [core]모두 포함 로컬 설정의 섹션 bare = true bare = false . 더 문제가되는 부분은 포함 origin[remote "origin"]섹션 mirror = true과 페치 스펙과 함께 리모트에 대해 잘못된 값을 가질 수 있다는 것입니다. 작업 사본에서는 제대로 작동하지 않습니다. 이러한 문제를 해결 한 후 정상적으로 복제하고 새 작업 사본을 이동하는 .git것이 더 효율적입니다.
Araxia

0

일반적으로 초기 저장소를 먼저 복제 한 다음 기존 폴더의 모든 항목을 초기 저장소로 이동합니다. 매번 작동합니다.

이 방법의 장점은 README 또는 .gitignore를 포함하여 초기 저장소가 누락되지 않는다는 것입니다.

아래 명령을 사용하여 단계를 완료 할 수도 있습니다.

$ git clone https://github.com/your_repo.git && mv existing_folder/* your_repo

0

다음 명령 줄을 재귀 적으로 입력하면됩니다.

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

0

를 사용하십시오. 다음과 같이 git clone명령 이 끝날 때 (해당 디렉토리에 있음)

cd your_dir_to_clone_in/
git clone git@github.com/somerepo/ .
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.