역사없이 git repo를 복사하십시오.


200

현재 github에 공개하려는 개인 저장소가 있습니다. 그러나 초기 커밋 중 일부에는 공개하고 싶지 않은 정보 (하드 코딩 된 자격 증명 등)가 포함되어 있습니다.

커밋 히스토리의 일부 또는 전부를 포함하지 않고 최신 커밋을 퍼블릭으로 만드는 가장 쉬운 방법은 무엇입니까?


왜 새로운 저장소를 만들지 않습니까?
Stephan

2
@Stephan 새 리포지토리를 생성하는 것이 좋지만 이전 리포지토리에서 최신 상태를 가져 와서 새로운 상태로 커밋하려면 어떻게해야합니까?
Rafe

19
.git 폴더를 삭제하고 소스가있는 폴더에서 다시 git init을 수행 할 수 있습니다.
Stephan

2
.git 폴더는 당신이 repositores의 혼합 위험성을 삭제하면, 당신은 하나에서 다른 병합 할 수있을 실 거예요
아놀드 로아

당신은 그것을 rebase 수 없습니다? 당신은 말 그대로 모든 오래된 커밋을 스쿼시 한 ​​다음 (강제) 밀어 넣습니다.
xaxxon

답변:


321

복제 하는 동안 히스토리의 깊이를 제한 할 수 있습니다 .

--depth <depth>
Create a shallow clone with a history truncated to the specified 
number of revisions.

제한된 역사를 원하지만 여전히 일부를 원한다면 이것을 사용하십시오.


40
이 사람에게 쿠키를 제공하십시오 (이 답변을 올바르게 표시하는 형태로) :)
FateNuller

7
이것은 원격 공개 저장소로 푸시 할 수있는 질문에 의해 암시 된 의도 된 사용법을 다루지 않습니다. 얕은 복제본을 푸시하려고하면 결과가 나타납니다 shallow update not allowed.
브래드 녹스

280

다음 명령을 사용하십시오.

git clone --depth <depth> -b <branch> <repo_url>

어디:

  • depth포함하려는 커밋의 양입니다. 즉, 최신 커밋 사용을 원할 경우git clone --depth 1
  • branch복제하려는 원격 지점의 이름입니다. 즉, master분기 사용 에서 마지막 3 개의 커밋을 원할 경우git clone --depth 3 -b master
  • repo_url 당신의 저장소의 URL입니다

7
이것은 실제로 Gautier와 동일한 대답이지만 더 완전하고 예제입니다.
23:24에

3
실제로 그렇습니다. 때로는 예가 필요한 것입니다. 나를 위해, 그것을 작성하는 것은 문제를 명확히 한 것입니다
Agam Rafaeli

3
주된 대답에 +1하지만 깊이를 적용 할 지점을 선택하는 방법에 대한 설명을 위해이 항목에도 복제-이것이 복제 명령의 일부라는 것을 알고 있습니다. and me simple
:)

7
이것이 어떻게 질문에 대답합니까? 이 모든 것은 로컬에서 얕은 복제본을 만드는 것입니다. 기록이 제한된이 로컬 사본을 새로운 저장소에 어떻게 복사합니까?
BradDaBug

4
@BradDaBug는 유효한 포인트를 제공합니다. 위의 지침에 따라 깊이를 1로 제한 한 다음 원격 원점을 변경하고 새 리포지토리로 푸시하려고했습니다. 그러나에 오류가 발생했습니다 shallow update not allowed. 이 스택 오버플로 응답 이이 인스턴스에서 유용하다는 것을 알았습니다 .
Craig Myles

18

.git폴더를 삭제하는 것은 기록을 원하지 않거나 필요로하지 않기 때문에 가장 쉬운 경로 일 것입니다 (Stephan이 말했듯이).

따라서 최근 커밋에서 새 저장소를 만들있습니다. ( 전체 히스토리없이 시드 / 킥 스타트 프로젝트를 복제하는 방법? )

git clone <git_url>

그런 다음 삭제 .git하고 나중에 실행하십시오.

git init

또는 현재 저장소재사용 하려면 현재 커밋을 Git 저장소에서 유일한 (초기) 커밋으로 만드시겠습니까?

그런 다음 위의 단계를 수행하십시오.

git add .
git commit -m "Initial commit"

리포지토리로 미십시오.

git remote add origin <github-uri>
git push -u --force origin master

6
#!/bin/bash
set -e

# Settings
user=xxx
pass=xxx
dir=xxx
repo_src=xxx
repo_trg=xxx
src_branch=xxx

repo_base_url=https://$user:$pass@bitbucket.org/$user
repo_src_url=$repo_base_url/$repo_src.git
repo_trg_url=$repo_base_url/$repo_trg.git

echo "Clone Source..."
git clone --depth 1 -b $src_branch $repo_src_url $dir

echo "CD"
cd ./$dir

echo "Remove GIT"
rm -rf .git

echo "Init GIT"
git init
git add .
git commit -m "Initial Commit"
git remote add origin $repo_trg_url

echo "Push..."
git push -u origin master

2
--depth 1역사도 함께 삭제 되었기 때문에이 경우에는 불필요rm -rf .git
rayphi

3
나는 이렇게 할 것이라고 생각합니다 :git clone --depth 1 -b $src_branch $repo_src_url $dir && cd ./$dir && git commit --amend --author "Some One <some@one.com>" -m "Initial Commit" && git remote set-url origin $repo_trg_url && git push -u origin master
rayphi

11
@rayphi 예, --depth 1불필요하지만 또한 무해하며 약간의 네트워크 대역폭을 절약합니다 (어쨌든 삭제하려는 기록을 가져 오는 지점 없음)
Silas S. Brown

1
리포지토리를 호환 가능하게 유지하려면이 작업을 수행하지 않는 것이 좋습니다.
Arnold Roa 2016 년

git을 제거하면 모든 git hook도 제거됩니다.
JudaPriest

0

이것이 rebase를 찌그러 뜨리는 것과 정확히 일치하지 않습니까? 마지막 커밋을 제외한 모든 것을 스쿼시 한 ​​다음 (강제) 밀어 넣으십시오.

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