ฉันจะโคลนพื้นที่เก็บข้อมูลคอมไพล์ด้วยการแก้ไขเฉพาะบางอย่างที่ฉันมักทำใน Mercurial ได้อย่างไร:
hg clone -r 3 /path/to/repository
ฉันจะโคลนพื้นที่เก็บข้อมูลคอมไพล์ด้วยการแก้ไขเฉพาะบางอย่างที่ฉันมักทำใน Mercurial ได้อย่างไร:
hg clone -r 3 /path/to/repository
คำตอบ:
อัปเดต 2เนื่องจากGit 2.5.0คุณลักษณะที่อธิบายด้านล่างสามารถเปิดใช้งานในฝั่งเซิร์ฟเวอร์พร้อมตัวแปรการกำหนดค่าได้uploadpack.allowReachableSHA1InWant
ที่นี่คำขอคุณลักษณะ GitHubและGitHub ยอมรับการเปิดใช้งานคุณลักษณะนี้ ทราบว่าบางเซิร์ฟเวอร์ Git เปิดใช้งานตัวเลือกนี้โดยค่าเริ่มต้นเช่น Bitbucket เซิร์ฟเวอร์ที่เปิดใช้งานมันตั้งแต่รุ่น 5.5 ขึ้นไป ดูคำตอบนี้ใน Stackexchangeสำหรับตัวอย่างวิธีการเปิดใช้งานตัวเลือกการกำหนดค่า
อัปเดต 1สำหรับเวอร์ชัน Git 1.7 < v < 2.5
ใช้ git clone และ git reset ดังอธิบายในคำตอบของ Vaibhav Bajpai
clone
หากคุณไม่ต้องการที่จะดึงข้อมูลที่เก็บเต็มแล้วคุณอาจจะไม่ควรจะใช้ คุณสามารถใช้การดึงข้อมูลเพื่อเลือกสาขาที่คุณต้องการดึงข้อมูลได้เสมอ ฉันไม่ใช่ผู้เชี่ยวชาญ hg ดังนั้นฉันจึงไม่ทราบรายละเอียด-r
แต่ในคอมไพล์คุณสามารถทำสิ่งนี้ได้
# make a new blank repository in the current directory
git init
# add a remote
git remote add origin url://to/source/repository
# fetch a commit (or branch or tag) of interest
# Note: the full history up to this commit will be retrieved unless
# you limit it with '--depth=...' or '--shallow-since=...'
git fetch origin <sha1-of-commit-of-interest>
# reset this repository's master branch to the commit of interest
git reset --hard FETCH_HEAD
git fetch origin <sha1>
งานได้ ดูเหมือนว่าคุณจะต้องผ่านการอ้างอิงที่มีชื่อเช่นแท็กหรือชื่อสาขา ดูkerneltrap.org/mailarchive/git/2009/1/13/4707444
git fetch origin <SHA1>
เพื่อสลับไปยังการแก้ไขใด ๆ ที่ฉันต้องการหลังจากดึงต้นแบบจากระยะไกลและดำเนินการreset --hard
เพื่อยกตัวอย่างสาขาในท้องถิ่น ฉันไม่สามารถเรียกการแก้ไขแต่ละรายการได้โดยตรง ด้วย git 1.7 git fetch origin <SHA1>
ไม่ทำงานตามที่รายงานโดย @artur คุณจำเป็นต้องใช้ตามด้วยgit checkout <SHA1>
reset --hard
$ git clone $URL
$ cd $PROJECT_NAME
$ git reset --hard $SHA1
หากต้องการกลับไปที่การกระทำล่าสุด
$ git pull
--depth
ซึ่งเป็นสิ่งสำคัญมากสำหรับ repos ขนาดใหญ่ วิธีนี้ต้องใช้การดึงวัตถุทั้งหมดแล้วรีเซ็ตเป็นรุ่นก่อนหน้า ใช้เวลามากและสิ้นเปลืองแบนด์วิดท์เครือข่าย
การโคลนที่เก็บ git นั้นจะเป็นการโคลนพื้นที่เก็บข้อมูลทั้งหมด: ไม่มีวิธีที่จะเลือกการแก้ไขเพียงครั้งเดียวในการโคลน แต่เมื่อคุณทำคุณสามารถชำระเงินเฉพาะการแก้ไขโดยการทำgit clone
checkout <rev>
git clone
คว้าพื้นที่เก็บข้อมูลทั้งหมด เมื่อคุณมีแล้วคุณสามารถเช็คเอาต์การแก้ไขที่เฉพาะเจาะจง
git clone --single-branch ...
หากต้องการโคลนการคอมมิทเฉพาะเจาะจงเพียงอันเดียวในการใช้แท็กสาขาหรือแท็กเฉพาะ:
git clone --depth=1 --branch NAME https://github.com/your/repo.git
น่าเสียดายที่NAME
สามารถเป็นชื่อสาขาหรือชื่อแท็กได้ (ไม่ใช่การมอบหมาย SHA)
งดการ--depth
ตั้งค่าสถานะเพื่อดาวน์โหลดประวัติทั้งหมดจากนั้นชำระเงินที่สาขาหรือแท็ก:
git clone --branch NAME https://github.com/your/repo.git
สิ่งนี้ใช้ได้กับ git รุ่นล่าสุด (ฉันใช้กับเวอร์ชัน2.18.0
)
หากคุณหมายถึงคุณต้องการดึงข้อมูลทุกอย่างตั้งแต่ต้นจนถึงจุดเฉพาะคำตอบของ Charles Bailey นั้นสมบูรณ์แบบ หากคุณต้องการย้อนกลับและดึงส่วนย่อยของประวัติย้อนกลับไปจากวันที่ปัจจุบันคุณสามารถใช้โดยgit clone --depth [N]
ที่ N คือจำนวนของ revs ของประวัติที่คุณต้องการ อย่างไรก็ตาม:
--ความลึก
สร้างโคลนตื้นที่มีประวัติถูกตัดให้เหลือจำนวนการแก้ไขที่ระบุ พื้นที่เก็บข้อมูลตื้นมีข้อ จำกัด จำนวนมาก (คุณไม่สามารถคัดลอกหรือดึงข้อมูลจากมันหรือผลักดันจากหรือเข้าไปในนั้น) แต่ก็เพียงพอแล้วถ้าคุณสนใจเฉพาะประวัติล่าสุดของโครงการขนาดใหญ่ที่มีประวัติยาวนานและต้องการ ส่งเป็นตัวแก้ไข
เพื่อสรุปสิ่งต่าง ๆ (git v. 1.7.2.1):
git clone
ที่คุณต้องการให้ repo เป็นประจำ(ทำให้ทุกอย่างทันสมัย - ฉันรู้ไม่ใช่สิ่งที่ต้องการเราไปถึงที่นั่น) git checkout <sha1 rev>
ของการหมุนรอบที่คุณต้องการgit reset --hard
git checkout -b master
master
และสลับไปที่สาขานั้น
git reset --hard
? เอกสารสำหรับการพูดว่า "รีเซ็ตดัชนีและแผนผังการทำงานการเปลี่ยนแปลงใด ๆ กับไฟล์ที่ถูกติดตามในแผนผังการทำงานตั้งแต่ <commit> [ซึ่งเป็นค่าเริ่มต้นไปที่ HEAD ซึ่งขณะนี้<sha1 rev>
] ถูกทิ้ง" แต่ ณ จุดนี้เราไม่ได้ทำการเปลี่ยนแปลงใด ๆ ตั้งแต่การโคลนดังนั้นวัตถุประสงค์คืออะไร มันตัดทอนสาขาปัจจุบันที่<sha1 rev>
หรือไม่
TL; DR - เพียงแค่สร้างแท็กในแหล่งเก็บข้อมูลต่อต้านการคอมมิทที่คุณต้องการโคลนและใช้แท็กในคำสั่งดึงข้อมูล คุณสามารถลบแท็กจาก repo ดั้งเดิมในภายหลังเพื่อล้าง
ในปี 2014 และดูเหมือนว่าคำตอบที่ได้รับการยอมรับของ Charles Baile จากปี 2010 นั้นล้าสมัยไปแล้วในตอนนี้และคำตอบอื่น ๆ ส่วนใหญ่ (ทั้งหมด?) เกี่ยวข้องกับการโคลนนิ่งซึ่งหลายคนหวังว่าจะหลีกเลี่ยง
โซลูชันต่อไปนี้บรรลุสิ่งที่ OP และคนอื่น ๆ กำลังมองหาซึ่งเป็นวิธีการสร้างสำเนาของที่เก็บรวมถึงประวัติ แต่ขึ้นอยู่กับการกระทำที่แน่นอน
นี่คือคำสั่งที่ฉันใช้กับ git เวอร์ชัน 2.1.2 เพื่อโคลน repo ในพื้นที่ (เช่นที่เก็บในไดเรกทอรีอื่น) จนถึงจุดหนึ่ง:
# in the source repository, create a tag against the commit you want to check out
git tag -m "Temporary tag" tmptag <sha1>
# create a new directory and change into that directory
cd somewhere_else;mkdir newdir;cd newdir
# ...and create a new repository
git init
# add the source repository as a remote (this can be a URL or a directory)
git remote add origin /path/to/original/repo
# fetch the tag, which will include the entire repo and history up to that point
git fetch origin refs/tags/tmptag
# reset the head of the repository
git reset --hard FETCH_HEAD
# you can now change back to the original repository and remove the temporary tag
cd original_repo
git tag -d tmptag
หวังว่าโซลูชันนี้จะทำงานต่อไปอีกไม่กี่ปี! :-)
คุณสามารถใช้งานได้ง่าย git checkout <commit hash>
ในลำดับนี้
bash
git clone [URLTORepository]
git checkout [commithash]
กระทำแฮดูเหมือนว่า "45ef55ac20ce2389c9180658fdba35f4a663d204"
ใช้ 2 จากคำตอบข้างต้น ( วิธีโคลนที่เก็บ git ด้วยการแก้ไข / เซ็ตการแก้ไขที่เฉพาะเจาะจงและวิธีการโคลนที่เก็บ git ด้วยการแก้ไข / เซ็ตการแก้ไขที่เฉพาะเจาะจง? ) ช่วยให้ฉันได้ข้อสรุป หากคุณต้องการโคลนนิ่งจนถึงจุดแล้วจุดนั้นต้องเป็นแท็ก / สาขาไม่ใช่แค่ SHA หรือ FETCH_HEAD สับสน หลังจากตั้งค่าการดึงข้อมูล Git หากคุณใช้สาขาหรือชื่อแท็กคุณจะได้รับการตอบกลับหากคุณใช้ SHA-1 เพียงอย่างเดียวคุณจะไม่ได้รับการตอบกลับ
นี่คือสิ่งที่ฉันทำ: - สร้างโคลนการทำงานเต็มรูปแบบของ repo เต็มจากแหล่งกำเนิดที่แท้จริง
cd <path to create repo>
git clone git@<our gitlab server>:ui-developers/ui.git
จากนั้นสร้างสาขาท้องถิ่น ณ จุดที่น่าสนใจ
git checkout 2050c8829c67f04b0db81e6247bb589c950afb14
git checkout -b origin_point
จากนั้นสร้าง repo เปล่าใหม่ของฉันพร้อมกับสำเนาโลคัลเป็นจุดเริ่มต้น
cd <path to create repo>
mkdir reduced-repo
cd reduced-repo
git init
git remote add local_copy <path to create repo>/ui
git fetch local_copy origin_point
ณ จุดนี้ฉันได้รับคำตอบนี้ ฉันสังเกตว่าเพราะถ้าคุณใช้ SHA-1 แทนสาขาด้านบนไม่มีอะไรเกิดขึ้นดังนั้นการตอบสนองหมายความว่ามันใช้งานได้
/ var / www / html / ui-hacking $ git เรียกข้อมูล local_copy origin_point รีโมต: การนับวัตถุ: 45493 เสร็จแล้ว รีโมต: บีบอัดวัตถุ: 100% (15928/15928) เสร็จแล้ว ระยะไกล: ทั้งหมด 45493 (เดลต้า 27508) นำกลับมาใช้ใหม่ 45387 (เดลต้า 27463) รับวัตถุ: 100% (45493/45493), 53.64 MiB | เสร็จแล้ว 50.59 MiB / s แก้ไขเดลตา: 100% (27508/27508) เสร็จแล้ว จาก / var / www / html / ui * branch origin_point -> FETCH_HEAD * [สาขาใหม่] origin_point -> origin / origin_point
ตอนนี้ในกรณีของฉันฉันต้องนำมันกลับไปใช้กับ gitlab เพื่อเป็น repo ใหม่ฉันก็เลยทำ
git remote add origin git@<our gitlab server>:ui-developers/new-ui.git
ซึ่งหมายความว่าฉันสามารถสร้าง repo ของฉันได้จาก origin_point โดยใช้git --git-dir=../ui/.git format-patch -k -1 --stdout <sha1> | git am -3 -k
เชอร์รี่เลือกจากระยะไกลจากนั้นใช้git push origin
เพื่ออัปโหลดล็อตทั้งหมดกลับไปที่บ้านใหม่
หวังว่าจะช่วยใครซักคน
git fetch local_copy origin_point
แตกต่างจาก JamesG git fetch origin refs/tags/tmptag
อย่างไร?
git fetch local_copy origin_point
ปล่อยให้คุณอยู่ในสถานะที่มีที่ว่างเปล่าไดเรกทอรีเท่านั้นที่มีreduced-repo
.git
มีบางอย่างที่ขาดหายไปจากคำแนะนำเหล่านี้คือ ...
เวอร์ชันของฉันคือการรวมกันของคำตอบที่ยอมรับและ upvoted ที่สุด แต่มันก็แตกต่างกันเล็กน้อยเพราะทุกคนใช้ SHA1 แต่ไม่มีใครบอกคุณว่าจะรับมันได้อย่างไร
$ git init
$ git remote add <remote_url>
$ git fetch --all
ตอนนี้คุณสามารถดูได้ทั้งหมด & คอมมิชชัน
$ git branch -a
$ git log remotes/origin/master <-- or any other branch
ในที่สุดคุณก็รู้ว่า SHA1 ของความมุ่งมั่นที่ต้องการ
git reset --hard <sha1>
ฉันใช้ตัวอย่างนี้กับ GNU ทำเพื่อปิดแท็กการแก้ไขสาขาหรือแฮช
มันถูกทดสอบใน git เวอร์ชั่น 2.17.1
${dir}:
mkdir -p ${@D}
git clone --recursive --depth 1 --branch ${revison} ${url} ${@} \
|| git clone --recursive --branch ${revison} ${url} ${@} \
|| git clone ${url} ${@}
cd ${@} && git reset --hard ${revison}
ls $@
git clone https://github.com/ORGANIZATION/repository.git
(โคลนที่เก็บ)
cd repository (navigate to the repository)
git fetch origin 2600f4f928773d79164964137d514b85400b09b2
git checkout FETCH_HEAD
# clone special tag/branch without history
git clone --branch=<tag/branch> --depth=1 <repository>
# clone special revision with minimal histories
git clone --branch <branch> <repository> --shallow-since=yyyy-MM-ddTHH:mm:ss # get the commit time
cd <dir>
git reset --hard <revision>
คุณไม่สามารถแก้ไขได้หากไม่มีประวัติหากไม่ได้ตั้งค่าไว้uploadpack.allowReachableSHA1InWant=true
ที่ฝั่งเซิร์ฟเวอร์ในขณะที่คุณสามารถสร้างแท็กสำหรับมันและโคลนแท็กพิเศษแทน
มันง่ายมาก คุณเพียงแค่ต้องตั้งค่าอัปสตรีมสำหรับสาขาปัจจุบัน
$ git clone repo
$ git checkout -b newbranch
$ git branch --set-upstream-to=origin/branch newbranch
$ git pull
นั่นคือทั้งหมดที่
git clone -o <sha1-of-the-commit> <repository-url> <local-dir-name>
git
ใช้คำorigin
แทนรู้จักกันแพร่หลายrevision
ต่อไปนี้เป็นตัวอย่างจากคู่มือ $ git help clone
--origin <name>, -o <name>
Instead of using the remote name origin to keep track of the upstream repository, use <name>.
--depth=1
ไม่ได้กล่าวถึงในคำตอบดังนั้นทำไมคุณถึงบอกว่าคำตอบนี้ใช้ได้ถ้าคุณเพิ่มสิ่งอื่น ๆ ที่ไม่ได้กล่าวถึงที่นี่ ฉันมีความสุขที่ได้ผลสำหรับคุณ แต่คำตอบนี้ทำให้เข้าใจผิดและไม่ตอบคำถามแม้ในบางส่วน ดังนั้น downvotes
git clone <url> <local_dir_name>
เพียงลองด้วยตัวคุณเอง ความแตกต่างเพียงอย่างเดียวคือรีโมต (แสดงโดยใช้git remote
) จะถูกเรียกว่าลำดับ sha1 ที่เป็นความลับแทนชื่อ "ต้นกำเนิด" ที่เป็นประเพณี ในคำอื่น ๆ ที่<sha1-of-the-commit>
กล่าวถึงในคำตอบนี้ไม่มีการแบกใด ๆ ที่มีการแก้ไขเรียกจากเซิร์ฟเวอร์หรือสาขาที่จะเช็คเอาท์
git clone -o 896066ee1cf4d653057dac4e952f49c96ad16fa7 https://github.com/torvalds/linux.git linux --depth=1
ไป นี้จะช่วยให้ฉันแก้ไข8a28d674
และไม่ได้ 896066ee
ตามที่คุณและคำตอบการเรียกร้องนี้
git clone -b 10.1 https://github.com/MariaDB/server.git --depth=1 mariadb-server-src