คัดลอก git repo ที่ไม่มีประวัติ


200

ขณะนี้ฉันมีที่เก็บส่วนตัวบน GitHub ที่ฉันต้องการให้เป็นสาธารณะ อย่างไรก็ตามการคอมมิทเริ่มต้นบางอย่างมีข้อมูลที่ฉันไม่ต้องการให้เป็นสาธารณะ (ฮาร์ดโค้ดที่มีการเข้ารหัส ฯลฯ )

เส้นทางที่ง่ายที่สุดในการทำให้การส่งมอบเป็นสาธารณะล่าสุดคืออะไร (ฉันไม่ต้องการหรือต้องการคอมมิชชันก่อนหน้าในที่เก็บสาธารณะ) โดยไม่รวมประวัติการกระทำบางอย่างหรือทั้งหมด


ทำไมคุณไม่เพิ่งสร้างที่เก็บใหม่
เตฟาน

2
@Stephan ฉันดีในการสร้างพื้นที่เก็บข้อมูลใหม่ แต่ฉันจะขัดขวางสถานะล่าสุดจากพื้นที่เก็บข้อมูลเก่าและยอมรับมันไปยังใหม่ได้อย่างไร
Rafe

19
คุณสามารถลบโฟลเดอร์. git และทำ git init อีกครั้งในโฟลเดอร์ซอร์สของคุณ
Stephan

2
การลบโฟลเดอร์. git จะทำให้ repositores สองตัวของคุณเข้ากันไม่ได้คุณจะไม่สามารถรวมจากที่หนึ่งไปยังอีกที่หนึ่งได้
Arnold Roa

คุณไม่สามารถรีบูทได้ใช่ไหม คุณเพียงแค่สควอชทั้งหมดเก่ากระทำแล้ว (แรง) ผลักดัน
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เป็นชื่อของสาขาระยะไกลที่คุณต้องการโคลน เช่นถ้าคุณต้องการ 3 ครั้งสุดท้ายจากการmasterใช้สาขาgit clone --depth 3 -b master
  • repo_url เป็น URL ของที่เก็บของคุณ

7
จริง ๆ แล้วนี่เป็นคำตอบเดียวกับ Gautier แต่สมบูรณ์กว่าและมีตัวอย่าง
เมา

3
แน่นอนมันเป็น บางครั้งตัวอย่างคือสิ่งที่จำเป็น สำหรับฉันการเขียนมันออกมาเป็นสิ่งที่ชัดเจนในประเด็นนี้
Agam Rafaeli

3
+1 กับคำตอบหลัก แต่รวมถึงคำอธิบายนี้เพื่ออธิบายเกี่ยวกับการเลือกสาขาที่คุณต้องการให้ความลึกใช้กับ - ฉันรู้ว่านี่เป็นส่วนหนึ่งของคำสั่ง clone - แต่มันเชื่อมโยงเข้าด้วยกันในใจที่เรียบง่ายของฉัน ... และฉันชอบง่าย
:)

7
คำถามนี้จะตอบคำถามได้อย่างไร ทั้งหมดนี้ทำคือการสร้างโคลนตื้น ๆ ในพื้นที่ แต่แล้วอะไรล่ะ? คุณจะคัดลอกสำเนาในเครื่องนี้ที่มีประวัติ จำกัด ไปยัง repo ใหม่ได้อย่างไร
BradDaBug

4
@BradDaBug แสดงถึงจุดที่ถูกต้อง ฉันทำตามคำแนะนำด้านบนซึ่งจำกัดความลึกเป็น 1 จากนั้นเปลี่ยนแหล่งกำเนิดระยะไกลจากนั้นลองผลักไปที่ repo ใหม่ของฉัน shallow update not allowedแต่ผมได้รับข้อผิดพลาดที่ระบุ ฉันพบคำตอบล้นสแต็กนี้จะเป็นประโยชน์ในกรณีนี้
Craig Myles

18

การลบ.gitโฟลเดอร์อาจเป็นเส้นทางที่ง่ายที่สุดเนื่องจากคุณไม่ต้องการ / ต้องการประวัติ (ตามที่สเตฟานกล่าว)

ดังนั้นคุณสามารถสร้าง repo ใหม่จากการกระทำล่าสุดของคุณ: ( วิธีโคลนโครงการ / kick-start โดยไม่ต้องมีประวัติทั้งหมด? )

git clone <git_url>

จากนั้นลบ.gitและเรียกใช้หลังจากนั้น

git init

หรือถ้าคุณต้องการที่จะใช้ repo ปัจจุบันของคุณอีกครั้ง: ทำให้ปัจจุบันยอมรับการกระทำ (เริ่มต้น) เท่านั้นในที่เก็บ Git?

ทำตามขั้นตอนข้างต้นแล้ว:

git add .
git commit -m "Initial commit"

กดไปที่ repo ของคุณ

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ไม่จำเป็น แต่ก็ยังเป็นอันตรายและมันจะช่วยประหยัดแบนด์วิธเครือข่ายเล็ก ๆ น้อย ๆ (ไม่มีจุดเรียกประวัติศาสตร์ที่คุณจะลบแล้ว)
สิลาสเอสบราวน์

1
ฉันไม่แนะนำให้ทำเช่นนี้หากคุณต้องการให้ที่เก็บของคุณใช้งานร่วมกันได้
Arnold Roa

การลบ. git ยังลบ hooks git ทั้งหมดด้วย
JudaPriest

0

นี่ไม่ใช่สิ่งที่การลดระดับการรีบูตจะทำอย่างไร เพียงแค่สควอชทุกอย่างยกเว้นการกระทำครั้งสุดท้ายแล้ว (บังคับ) ผลักมัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.