วิธีการเปลี่ยนที่เก็บระยะไกลสำหรับ submodule git หรือไม่


722

ฉันได้สร้างที่เก็บ git พร้อม submodule ในนั้น ฉันสามารถบอก submodule ตัวเองเพื่อเปลี่ยนพา ธ ของที่เก็บข้อมูลรีโมต แต่ฉันไม่แน่ใจว่าจะบอกที่เก็บพาเรนต์วิธีเปลี่ยนพา ธ ของที่เก็บรีโมตสำหรับ submodule ได้อย่างไร

ฉันจะไม่แปลกใจถ้าฉันค่อนข้างโชคดีและต้องทำสิ่งต่าง ๆ ด้วยตนเองเนื่องจากการลบ submodules ไม่ใช่เรื่องง่าย


8
หมายเหตุ: Git 2.25 (ไตรมาสที่ 1 ปี 2020) มาพร้อมกับคำสั่งใหม่ ":git submodule set-url [--] <path> <newurl>
VonC

คำตอบ:


1010

คุณควรจะสามารถแก้ไข.gitmodulesไฟล์เพื่ออัปเดต URL จากนั้นเรียกใช้git submodule syncเพื่อสะท้อนถึงการเปลี่ยนแปลงของซูเปอร์โปรเจ็กต์และสำเนาการทำงานของคุณ


22
ดูเหมือนจะไม่อัปเดต. git / config อย่างน้อยใน 1.7.1 หรือ 1.7.3
davidtbernal

6
สิ่งนี้อัปเดตการกำหนดค่า submodule url สำหรับการคอมมิชชันก่อนหน้าด้วยหรือไม่ เช่นถ้าฉันชำระเงินการกระทำที่เก่ากว่ามันจะชี้ไปที่ URL ที่ submodule ใหม่หรือไม่
maxmelbin

63
ใช้git submodule foreach -q git config remote.origin.urlเพื่อดู url submodule "จริง"
Joel Purra

10
ไม่ได้อัปเดต.git/configสำหรับฉันโดยใช้ git 2.1.0 ฉันต้องอัปเดตทั้งก่อน.gitmodulesและหลัง.git/configด้วยตนเองก่อนใช้งานgit submodule sync --recursiveเพื่อให้มีการอัปเดต submodule ทางไกล
desseim

7
สิ่งนี้ดูเหมือนจะขาดขั้นตอนสำคัญgit submodule update --init --recursive --remoteที่เปลี่ยนพื้นที่เก็บข้อมูลเป็นรีโมตใหม่จริงๆ
Jason Axelson

154

คำสั่งเหล่านี้จะทำงานพร้อมรับคำสั่งโดยไม่ต้องแก้ไขไฟล์ใด ๆ ในพื้นที่เก็บข้อมูลท้องถิ่น

git config --file=.gitmodules submodule.Submod.url https://github.com/username/ABC.git
git config --file=.gitmodules submodule.Submod.branch Development
git submodule sync
git submodule update --init --recursive --remote

โปรดดูภาพหน้าจอของบล็อก: การเปลี่ยน GIT submodules URL / Branch เป็น URL / สาขาอื่นของที่เก็บเดียวกัน


8
สิ่งนี้ใช้ได้ แต่ฉันต้องจำไว้ว่าให้ผลักดันการเปลี่ยนแปลงไปยังรีโมต git add .gitmodules git commit -m "modified submodule URL" git push origin master
skulz00

5
นั่นสร้างความยุ่งเหยิงอย่างมากสำหรับฉัน คำสั่งลงไปอย่างเงียบ ๆ แต่ที่เก็บ submodule จริงยังคงคิดว่ารีโมตคืออันเก่า (URL เก่า) บางทีคำสั่งเหล่านี้ควรมาพร้อมกับคำสั่งอื่น ๆ ภายในที่เก็บของ submodule?
Motti Shneor

5
คำสั่งสุดท้ายนั้นสุดขีด ... หากคุณมี submodules ภายใน submodules คำสั่งนี้จะทำการอัพเดท sub-submodules จากระยะไกลซึ่งไม่น่าจะเป็นสิ่งที่คุณต้องการ
Baptiste Wicht

7
โปรดทราบว่าคุณต้องแทนที่ Submod ด้วยชื่อ submodule ของคุณ!
Shital Shah

133

กล่าวง่ายๆคุณต้องแก้ไขไฟล์. gitmodules จากนั้นซิงค์และอัปเดต:

แก้ไขไฟล์โดยใช้คำสั่ง git หรือโดยตรง:

git config --file=.gitmodules -e

หรือเพียงแค่:

vim .gitmodules

จากนั้นซิงค์และอัปเดตใหม่:

git submodule sync
git submodule update --init --recursive --remote

6
git submodule update --initทำงานให้ฉัน--remoteดูเหมือนจะผูกไว้กับส่วนหัวของ repo ระยะไกล
Chaim Eliyah

95

ด้วย Git 2.25 (Q1 2020) คุณสามารถแก้ไขได้
ดูที่ " เปลี่ยน Git submodule url " และคำสั่งใหม่

git submodule set-url [--] <path> <newurl>

คำตอบเดิม (พฤษภาคม 2009 สิบปีที่ผ่านมา)

ที่จริงแล้วมีการส่ง patch ในเดือนเมษายน 2552เพื่อชี้แจงgitmoduleบทบาท

ดังนั้นตอนนี้เอกสาร gitmoduleยังไม่รวม:

.gitmodulesไฟล์อยู่ในไดเรกทอรีระดับบนสุดของต้นไม้คอมไพล์ทำงานเป็นแฟ้มข้อความที่มีรูปแบบที่ตรงกับความต้องการ -of linkgit: Git-config 1
[ใหม่]:
เนื่องจากไฟล์นี้จัดการโดย Git มันจะติดตาม + บันทึกของ submodules ของโครงการ
ข้อมูลที่เก็บไว้ในไฟล์นี้ใช้เป็นคำใบ้สำคัญสำหรับเวอร์ชันที่เชื่อถือได้ของบันทึกที่จัดเก็บในไฟล์กำหนดค่าโครงการ
การเปลี่ยนแปลงเรกคอร์ดเฉพาะผู้ใช้ (เช่นบัญชีสำหรับความแตกต่างใน submodule URL เนื่องจากสถานการณ์เครือข่าย) ควรทำกับไฟล์การกำหนดค่าในขณะที่การเปลี่ยนแปลงเรคคอร์ดที่จะเผยแพร่ (เช่น + เนื่องจากการย้ายตำแหน่งของแหล่ง submodule) ควรทำกับไฟล์นี้ .

ยืนยันว่าสวยมากคำตอบของจิม


หากคุณทำตามบทช่วยสอนซับไตเติ้ล Gitนี้คุณจะเห็นว่าคุณต้องมี " git submodule init" เพื่อเพิ่ม URL ที่เก็บ submodule ไปยัง. git / config

" git submodule sync" ถูกเพิ่มในเดือนสิงหาคม 2008อย่างแม่นยำเพื่อให้งานง่ายขึ้นเมื่อมีการเปลี่ยนแปลง URL (โดยเฉพาะอย่างยิ่งถ้าจำนวนของ submodules มีความสำคัญ)
สคริปต์เชื่อมโยงกับคำสั่งนั้นตรงไปตรงมามากพอ:

module_list "$@" |
while read mode sha1 stage path
do
    name=$(module_name "$path")
    url=$(git config -f .gitmodules --get submodule."$name".url)
    if test -e "$path"/.git
    then
    (
        unset GIT_DIR
        cd "$path"
        remote=$(get_default_remote)
        say "Synchronizing submodule url for '$name'"
        git config remote."$remote".url "$url"
    )
    fi
done

เป้าหมายยังคงอยู่: git config remote."$remote".url "$url"


ฉันต้องการเปลี่ยน URL ของ submodule เฉพาะในเครื่องนี้ จากโครงการหลักฉันสามารถแก้ไขบันทึก.git/configโดยทำ: git config submodule."$submodule_name".url "$new_url" ซึ่งอธิบายไว้ที่นี่ด้วย
joeytwiddle

ขีดคั่นสองทางเลือกgit submodule set-url [--] <path> <newurl>ทำอะไร?
jeverling

1
@jeverling พวกเขาช่วยแยกตัวเลือกจากพารามิเตอร์: ดูstackoverflow.com/a/1192194/6309
VonC

1
โปรดทราบว่าสำหรับผู้ใช้ Ubuntu ที่มีคอมไพล์รุ่นเก่ากว่าคุณสามารถใช้ PPA นี้เพื่ออัปเดต: launchpad.net/~git-core/+archive/ubuntu/ppa
starbeamrainbowlabs

69

ทำงานได้ดีสำหรับฉัน (บน Windows โดยใช้ git รุ่น 1.8.3.msysgit.0):

  • อัพเดต. gitmodules ด้วยพา ธ ไปยังที่เก็บใหม่
  • ลบบรรทัดที่เกี่ยวข้องออกจากไฟล์ ".git / config"
  • ลบไดเรกทอรีที่เกี่ยวข้องในไดเรกทอรี ".git / modules / external"
  • ลบไดเรกทอรี submodule ที่ทำเครื่องหมายเอาไว้แล้ว (ไม่แน่ใจว่าจำเป็นหรือไม่)
  • เรียกใช้git submodule initและgit submodule update
  • ตรวจสอบให้แน่ใจว่า submodule ที่ตรวจสอบแล้วอยู่ในการส่งที่ถูกต้องและยอมรับว่าเนื่องจากเป็นไปได้ว่าแฮชจะแตกต่างกัน

หลังจากทำทุกอย่างทุกอย่างจะอยู่ในสถานะที่ฉันคาดหวัง ฉันคิดว่าผู้ใช้คนอื่น ๆ ของพื้นที่เก็บข้อมูลจะมีอาการปวดคล้ายกันเมื่อพวกเขามาถึงการปรับปรุง - คุณควรอธิบายขั้นตอนเหล่านี้ในข้อความยืนยันของคุณ!


2
ขอบคุณมากสำหรับเรื่องนี้. git submodule updateนี้เป็นเพียงหนึ่งที่ทำงานให้ฉันหลังจากที่ฉันได้ทำงานแล้ว การปฏิบัติตามคำตอบอื่น ๆ จะไม่เปลี่ยนแปลงสิ่งที่อยู่ใน./git/modules/externaldir ดังนั้นการพยายามอัปเดตจะส่งผลให้ยังคงดึง URL ที่ไม่ถูกต้อง
NtscCobalt

ดูเหมือนว่าจะเป็นอันตรายเล็กน้อยและฉันไม่แน่ใจว่าจะรักษาประวัติของ submodule ก่อนหน้านี้ ตัวอย่างเช่นหากคุณต้องการตรวจสอบการกระทำเก่าหรือสาขาของพื้นที่เก็บข้อมูลหลักของคุณ (ที่มี submodule) ฉันไม่แน่ใจว่าจะรู้ได้อย่างไรว่าจะดึงการเชื่อมต่อแบบเก่าของ OLD และเกี่ยวข้องกับการกระทำแบบเก่าของหลัก .
Motti Shneor

ไม่มันแทบจะไม่รู้เลยว่าคุณจะต้องทำตามทุกขั้นตอนหลังจากขั้นตอนแรกอีกครั้ง นี่เป็นเพียงสิ่งที่ฉันพบว่าทำงานเพื่อให้ได้สถานะของ submodule ในปัจจุบัน ผมไม่ทราบว่าถ้ารัฐของสิ่งที่มีการเปลี่ยนแปลงตั้งแต่ที่ผมเขียนนี้ใจ :)
เบน Hymers

@MottiShneor ที่ดูเหมือนว่าอันตรายแน่นอนถ้าคุณต้องการเก็บประวัติ submodule ก่อนหน้านี้ แต่ฉันไม่แน่ใจเกี่ยวกับเรื่องนี้ ในกรณีของฉันมันเป็นทางออกเดียวที่ทำงานได้สิ่งที่ฉันต้องการคือแทนที่
ซับโดลูต

1
ทำตามขั้นตอนเหล่านี้และพบว่า "ลบไดเรกทอรี submodule ที่ตรวจสอบแล้ว (ไม่แน่ใจว่าจำเป็นหรือไม่)" เป็นสิ่งที่จำเป็นมิฉะนั้นคุณจะพบกับ "ร้ายแรง: ไม่ใช่ที่เก็บ git: ... " เมื่อใช้งานการปรับปรุง
God

10

เพียงแก้ไขไฟล์. git / config ของคุณ ตัวอย่างเช่น; หากคุณมีsubmodule "ทั่วไป"คุณสามารถทำได้ใน super-module:

git config submodule.common.url /data/my_local_common

นี่เป็นวิธีที่ดีที่สุดหากคุณพยายามที่จะเปลี่ยน URL สำหรับการใช้งานครั้งเดียวไม่ใช่อย่างถาวรในโครงการสุดยอด เช่นคุณต้องการโคลน submodules จากการคัดลอกบนดิสก์
แอนดี้

4

git config --file=.gitmodules -e เปิดตัวแก้ไขเริ่มต้นที่คุณสามารถอัพเดตพา ธ

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