비어 있지 않은 디렉토리로 어떻게 복제합니까?


572

디렉토리 A와 디렉토리 B가 일치하는 파일이 있습니다. 디렉토리 A에는 다른 필요한 파일이있을 수 있습니다. 디렉토리 B는 자식 저장소입니다.

나는 디렉토리가 비어 있기 때문에 저를 허용하지 않습니다 디렉토리 A와 복제 디렉토리 B하지만 자식-복제 할.

나는 그냥 클론 .git 것이며, 모든 파일이 일치하기 때문에 나는 거기에서 갈 수 기대했다?

디렉토리 A에 디렉토리 B에없는 파일이 있고이를 유지하려고하므로 빈 디렉토리로 복제 할 수 없습니다.

참조를 푸시 / 풀하기를 원하고 수동으로 설정하고 싶지 않기 때문에 .git 복사는 옵션이 아닙니다.

이것을 할 수있는 방법이 있습니까?

업데이트 : 이것이 효과가 있다고 생각합니다. 누구든지 문제를 볼 수 있습니까? ->

cd a
git clone --no-hardlinks --no-checkout ../b a.tmp 
mv a.tmp/.git .
rm -rf a.tmp
git unstage # apparently git thinks all the files are deleted if you don't do this

5
아마도 당신은 대답을 바꿀 수 있습니까?
Bastiaan Quast

답변:


724

이것은 나를 위해 일했다 :

git init
git remote add origin PATH/TO/REPO
git fetch
git reset origin/master  # Required when the versioned files existed in path before "git init" of this repo.
git checkout -t origin/master

참고 : -t 원하는 경우 업스트림 분기를 설정하고 일반적으로 수행합니다.


70
들어오는 파일이 이미 존재하는 경우 (원래 질문에서 설명한대로) 비어 있지 않은 디렉토리에서 작동하지 않습니다. 당신하지만 git reset origin/master애프터 git fetch, 그것은 (또한 로컬 변경 사항을 보존) 작동합니다.
Araxia

8
치명적 : 경로를 업데이트하고 동시에 '마스터'분기로 전환 할 수 없습니다.
Arnold Roa

7
이 답변은 저에게 효과적이지 않습니다. 내가 git checkout ...자식을 할 때 모든 파일을 덮어 쓸 것이라고 불평하고 먼저 이동해야합니다. `git reset origin / master /`를 먼저 수행하면 checkout 명령은 master라는 브랜치가 이미 존재한다고 불평합니다.
Saskia

4
git checkout master나를위한 충분한 최종 단계였습니다.
yoyo

16
모든 단계가 완벽하게 작동했지만 마지막 단계는 나에게 도움이되었습니다 fatal: A branch named 'master' already exists. 나는 정말로 그것을 필요로하지 않았다고 생각합니다.
Shadi

164

다음 쉘 명령에서 existing-dir시 내용에 추적 파일과 일치 디렉토리 인 repo-to-clone자식 저장소는.

# Clone just the repository's .git folder (excluding files as they are already in
# `existing-dir`) into an empty temporary directory
git clone --no-checkout repo-to-clone existing-dir/existing-dir.tmp # might want --no-hardlinks for cloning local repo

# Move the .git folder to the directory with the files.
# This makes `existing-dir` a git repo.
mv existing-dir/existing-dir.tmp/.git existing-dir/

# Delete the temporary directory
rmdir existing-dir/existing-dir.tmp
cd existing-dir

# git thinks all files are deleted, this reverts the state of the repo to HEAD.
# WARNING: any local changes to the files will be lost.
git reset --hard HEAD

5
나는 git reset --hard HEAD"삭제 된"파일을 포기하지 않았을 것이다.
Dimitar

18
git reset HEAD나를 위해 잘 작동했습니다. git reset --hard HEAD파일의 변경 사항을 삭제하므로 리포지토리의 파일과 정확히 동일하지 않은 경우에는 그렇게하지 않아야합니다.
Tgr

1
git reset HEAD나에게 아무런 영향을 미치지 않는 것 같습니다. git reset --hard HEAD하지만 파일에 대한 변경 사항이 손실됩니다. 더 나은 해결책이 있습니까?
Jacob Dorman

1
@Casey의 답변-git init / remote add / fetch / checkout-더 깔끔하고 간단하며 임시 폴더가 필요하지 않습니다.
yoyo

1
@Casey의 대답은 폴더에 남아 있어야하지만 git repo에는없는 파일이 이미있을 때 작동하지 않았습니다. 파일과 디렉토리가 생성 된 설치 스크립트를 실행 한 후 구성을 업데이트하는 데 유용하지만 설치된 항목 위에 파일을 업데이트 / 추가해야합니다.
soulston

104

나를 위해 일한 답변 중 하나를 약간 수정했습니다.

git init
git remote add origin PATH/TO/REPO
git pull origin master

마스터 브랜치에서 바로 작업을 시작합니다.


1
gitignore에 지정된 관련없는 파일을 제거하지 않고 더러운 기존 디렉토리를 정리하려면 HEAD를 재설정해야합니다.
Ray Foss

1
이것은 @cmcginty의 대답과 달리 실제로 나를 위해 일한 것입니다.
확실히

4
이것은 git-clone과 상당히 다릅니다. 누락 된 것은 마스터 브랜치의 업스트림 정보입니다. 를 추가하여 수정할 수 있습니다 git branch --set-upstream-to=origin/master master.
Slaven Rezic

이 버전은 나를 위해 일한, 단지 자식 리셋 --hard HEAD해야 할 일을했을
프레데릭 클레

29

경고-파일을 덮어 쓸 수 있습니다.

git init     
git remote add origin PATH/TO/REPO     
git fetch     
git checkout -t origin/master -f

@ cmcginty의 답변 에서 수정되었습니다 . -f 없이는 저에게 효과적이지 않았습니다.


반드시 이후에 모든 파일을 체크 아웃해야 git checkout .합니까?
Chris Stryczynski

25

다음은 동일한 문제가 발생했을 때 수행 한 결과입니다 (적어도 동일한 문제라고 생각합니다). 나는 디렉토리 A에 들어가서 달렸다 git init.

디렉토리 A의 파일 뒤에 git이 필요하지 않기 때문에 .gitignore를 편집하고 기존 파일을 추가했습니다. 이 후에 내가 git remote add origin '<url>' && git pull origin mastervoila를 실행 하면 B는 단일 딸꾹질없이 A에 "복제"됩니다.


2
들어오는 파일이 이미 존재하는 경우 (원래 질문에서 설명한대로) 비어 있지 않은 디렉토리에서는이 기술이 작동하지 않습니다.
Araxia

11

몇 분 전에 이것을 사용했으며 잠재적으로 가장 파괴적인 명령이 필요합니다.

cd existing-dir
git clone --bare repo-to-clone .git
git config --unset core.bare
git remote rm origin
git remote add origin repo-to-clone
git reset

그리고 voilá!


10

또 다른 간단한 요리법이 나를 위해 잘 작동하는 것 같습니다.

git clone --bare $URL .git
git config core.bare false

기존 파일이있는 디렉토리를 체크 아웃하는 주요 사용 사례는 Git을 사용하여 Unix 도트 파일을 제어하는 ​​것입니다. 새 계정에서 홈 디렉토리에는 이미 Git에서 가져오고 싶은 파일이 있습니다.


1
베어 리포지토리는 약간 다르게 설정되며 작동하지만 권장하지 않습니다. :)
ThorSummoner

1
더 자세하게 얘기해 주 시겠어요? 무엇이 다른가요?
Ken Williams

1
두 가지 차이점 만 있습니다. 1.) .git/config파일은 저장소가 베어 졌음을 나타냅니다. 2.) 일반적으로 저장된 파일 .git은 루트 (사용자가 호출 한 .git)에 저장됩니다
mozey

4
그것들은 복제 .git와 설정 core.bare이 처리 false할 변경 사항들이므로이 방법에 대해 여전히 기분이 좋습니다.
Ken Williams

10

이것은 나를 위해 일했다 :

cd existing_folder
git init
git remote add origin path_to_your_repo.git
git add .
git commit
git push -u origin master

6

준비 웹 서버로 사용할 새 Apache 웹 디렉터리 (WHM으로 만든 계정)와 비슷한 문제가있었습니다. 처음에는 코드 기반으로 새 프로젝트를 복제하고 저장소에서 가져와 변경 사항을 주기적으로 배포해야했습니다.

문제는 계정에 이미 다음과 같은 웹 서버 파일이 포함되어 있다는 것입니다.

.bash_history
.bash_logout
.bash_profile
.bashrc
.contactemail
.cpanel/
...

... 저장소를 삭제하거나 커밋하고 싶지 않습니다. 나는 그들이 무대에 있고 추적되지 않은 채 머물 필요가있었습니다.

제가 한:

내 웹 폴더 (existing_folder)로 이동했습니다.

cd /home/existing_folder

그리고:

git init
git remote add origin PATH/TO/REPO
git pull origin master
git status

cPanel 웹 계정에서 처음에 존재했던 많은 준비되지 않은 파일 목록이 예상대로 표시되었습니다.

그런 다음 이 기사 덕분 에 해당 파일 목록을 다음에 추가했습니다.

**.git/info/exclude**

파일과 거의 비슷한이 .gitignore파일을 사용하면 파일이 준비되지 않도록 무시할 수 있습니다. 이 후 나는 .git / 디렉토리에 커밋 .gitignore할 것이 없었습니다. 다른 사람이 볼 수없는 개인처럼 작동합니다 .

이제 git status반품을 확인 합니다.

On branch master
nothing to commit, working tree clean

이제 내 자식 저장소에서 간단히 가져 와서이 웹 서버에 변경 사항을 배포 할 수 있습니다. 이것은 일부 웹 개발자가 준비 서버를 쉽게 만들 수 있기를 바랍니다.


5

내가하고있는 일은 다음과 같습니다.

git clone repo /tmp/folder
cp -rf /tmp/folder/.git /dest/folder/
cd /dest/folder
git checkout -f master

4

어쩌면 내가 질문을 오해,하지만 당신은 자식의 repo A에서 B로 파일을 이동에 필요한 것들을 추가 / 복사 할 경우 그것은 간단하지 않을 것입니다 자식 추가 ?

업데이트 : 자식 문서에서 :

기존 디렉토리로의 복제는 디렉토리가 비어있는 경우에만 허용됩니다.

출처 : http://git-scm.com/docs/git-clone


2
아니요, 소유자와 파일은 임의적 일 수 있습니다. 이것은 여러 개발자가있는 상황입니다. 우리는 모두 기존 디렉토리를 가지고 있으며 현재 오직 하나만 git checkout을 가지고 있습니다. 우리는 대체로 동일한 파일 하위 집합을 가지므로 다른 개발자가 파일을 유지하면서 복제 할 수 있기를 원합니다. 그리고 최대한 우아하고 편리해야합니다.
Dale Forester

솔직히, 나는 그런 상태에서 발전의 요점을 보지 못합니다. 분기 및 병합 작업을 사용할 수 없습니까? 아니면 외부 종속성이있는 하위 리포지토리가 있습니까? 왜 단일 "git checkout"에 의존하고 싶습니까?
Roberto Aloi

5
"단일 git checkout"은 전체 시련의 요점이 아닙니다. 이것이 바로 그런 방식 일 뿐이며 앞으로 나아갈 방법이 필요합니다. 작동하는 것처럼 보이는 솔루션으로 원래 질문을 업데이트했습니다. 그래도 의견을 보내 주셔서 감사합니다.
데일 포레스터

3
이에 대한 합법적 인 사례가 많이 있습니다. 프로젝트 소스를 설정하기 전에 설정해야하는 복잡한 폴더 트리가 있고 해당 폴더 트리에는 GitHub에 저장할 수없는 라이센스가있는 저작물이 포함되어 있습니다.
BrainSlugs83

3

나는 비슷한 것을 찾고 있었고, 내가 생각해 낸 것은 다음과 같습니다.

내 상황은 활성 웹 트리가 있고 현재 웹 트리의 파일을 이동하지 않고 원격 저장소를 만들려고했습니다. 내가 한 일은 다음과 같습니다.

  1. 웹 트리로 이동하여 실행 git init
  2. 저장소의 원하는 위치로 이동하여 다음을 실행하십시오. git clone --bare /path/to/web/repo
  3. 내 원격 저장소에서 구성 파일을 편집하고 [remote "origin"]섹션을 제거 하십시오.
  4. [remote "origin"]웹 트리에서 새 원격 저장소를 가리키는 섹션을 .git / config에 추가하십시오 .

나는이 조리법을 많이 좋아한다.
dland

git clone --bare여기가 불필요하고 우회입니다. git remote add origin <URL>처음에는 왜 안 되나요?
Araxia

3

이것은 나를 위해 작동하지만 원격 저장소 파일을 로컬 파일에 병합해야합니다.

git init
git remote add origin url-to-git
git branch --set-upstream-to=origin/master master
git fetch
git status

1

나는 Dale의 답변을 좋아 했고 또한 추가했다.

git clone --depth 2 --no-checkout repo-to-clone existing-dir/existing-dir.tmp
git branch dev_new214
git checkout dev_new214
git add .
git commit
git checkout dev
git merge dev_new214

얕은 깊이는 많은 초기 개발 커밋을 피했습니다. 새로운 지점은 우리에게이 서버의 새로운 코드가 있다는 시각적 인 역사를 보여주었습니다. 그것은 제 의견으로는 완벽한 사용 지점입니다. 여기에 게시 한 모든 사람들의 큰 통찰력에 감사드립니다.


0

C / 코드로 복제하려고 할 때 동일한 문제가 발생했습니다.

그러나이 폴더에는 전체 프로젝트가 포함되어 있습니다.

c / code / newproject에 새 폴더를 만들고 클론을이 폴더에 매핑했습니다.

데스크톱 용 git은 내 사용자에게 물었고 잘 복제했습니다.

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