มีวิธีที่จะมีโดยอัตโนมัติgit submodule update
(หรือgit submodule update --init
เรียกว่ายิ่งเมื่อใดก็ตามที่git pull
จะทำ?
กำลังมองหาการตั้งค่าการตั้งค่า git หรือนามแฝง git เพื่อช่วยในเรื่องนี้
มีวิธีที่จะมีโดยอัตโนมัติgit submodule update
(หรือgit submodule update --init
เรียกว่ายิ่งเมื่อใดก็ตามที่git pull
จะทำ?
กำลังมองหาการตั้งค่าการตั้งค่า git หรือนามแฝง git เพื่อช่วยในเรื่องนี้
คำตอบ:
ในฐานะของGit 2.14คุณสามารถใช้git pull --recurse-submodules
(และใช้นามแฝงกับสิ่งที่คุณต้องการ)
ในฐานะของGit 2.15คุณสามารถตั้งค่าsubmodule.recurse
เป็นจริงเพื่อเปิดใช้งานพฤติกรรมที่ต้องการ
คุณสามารถทำได้ทั่วโลกโดยเรียกใช้:
git config --global submodule.recurse true
git pull
ยังเรียก submodule submodule update
และเรียกใช้ นี่จำเป็นต้องเป็นคำตอบที่ได้รับการยอมรับในขณะนี้
git config --global submodule.recurse true
git clone
เช่นกัน และทำให้มันเป็นค่าเริ่มต้น มิฉะนั้นจะเป็นต้านทานขนาดใหญ่เพื่อใช้ submodules เป็นโมดูลของผู้คนมักจะได้รับออกจากซิงค์ :-(
commit
, fetch
, pull
ฯลฯ ) ถูกออกแบบมาเพื่อนำมาประยุกต์ใช้กับที่เก็บในปัจจุบัน submodule เป็นที่เก็บอื่นและไม่ควรได้รับผลกระทบจากคำสั่งที่ดำเนินการในพื้นที่เก็บข้อมูลหลักโดยค่าเริ่มต้น นี่เป็นการตัดสินใจออกแบบโดยนักพัฒนาคอมไพล์
git config --global alias.pullall '!git pull && git submodule update --init --recursive'
หากคุณต้องการให้อาร์กิวเมนต์ส่งผ่านไปยัง git pull ให้ใช้สิ่งนี้แทน:
git config --global alias.pullall '!f(){ git pull "$@" && git submodule update --init --recursive; }; f'
เริ่มต้นด้วย Git 1.7.5 ควรอัปเดต submodules โดยอัตโนมัติตามค่าเริ่มต้นที่คุณต้องการ
[แก้ไข: ตามความคิดเห็น: พฤติกรรม 1.7.5 ใหม่คือการดึงข้อมูลการส่งล่าสุดสำหรับการส่งข้อมูลโดยอัตโนมัติแต่จะไม่อัปเดตพวกเขา (ตามgit submodule update
ความหมาย) ดังนั้นข้อมูลในคำตอบนี้จึงเกี่ยวข้องกับพื้นหลัง แต่ไม่ใช่คำตอบที่สมบูรณ์ด้วยตัวเอง คุณยังต้องใช้นามแฝงเพื่อดึงและอัปเดต submodules ในคำสั่งเดียว]
พฤติกรรมเริ่มต้น "ตามคำขอ" คือการอัปเดต submodules ทุกครั้งที่คุณดึงข้อมูลคอมมิชชันที่อัพเดทการยอมรับ submodule และการกระทำนี้ไม่ได้อยู่ในโคลนในเครื่องของคุณ
นอกจากนี้คุณยังสามารถอัปเดตได้ทุกครั้งที่ดึงข้อมูลหรือไม่ (พฤติกรรม 1.7 ก่อนที่ฉันคิด) ตัวเลือกการตั้งค่าที่จะเปลี่ยนพฤติกรรมนี้
fetch.recurseSubmodules
on-demand
ตัวเลือกนี้สามารถตั้งค่าได้อย่างใดอย่างหนึ่งให้เป็นค่าบูลีนหรือ
การตั้งค่าเป็นบูลีนจะเปลี่ยนพฤติกรรมของfetch
และpull
เพื่อชดเชยให้เป็นแบบไม่ จำกัด เมื่อตั้งค่าเป็นจริงหรือไม่รับเลยเมื่อตั้งค่าเป็นเท็จเมื่อตั้งค่า
on-demand
(ค่าเริ่มต้น)fetch
และpull
จะ recurse เป็น submodule ประชากรเมื่อ superproject มันดึงกระทำการปรับปรุงที่อ้างอิง
ดู:
git config
หน้าคน (1.7.5) (หรือgit config
หน้าคนล่าสุด)git fetch
หน้าคน (1.7.5) (หรือเรียกหน้าคนGitล่าสุด)สำหรับข้อมูลเพิ่มเติม.
git fetch --recurse-submodules[=yes|on-demand|no]
git fetch
git submodule update
git pull
แทนที่จะใช้git fetch
ตัวเลือกนี้จะทำให้การเรียกซ้ำเกิดขึ้น มันจะไม่เปลี่ยนแปลงสิ่งที่กระทำถูกตรวจสอบใน submodules เลย ดังนั้นgit submodule update
ยังคงมีความจำเป็นตามที่ระบุไว้โดย @Atem
ฉันประหลาดใจที่ไม่มีใครพูดถึงการใช้ hooks git เพื่อทำสิ่งนี้!
เพียงเพิ่มไฟล์ที่มีชื่อpost-checkout
และpost-merge
ใน.git/hooks
ไดเรกทอรีของที่เก็บที่เกี่ยวข้องและใส่ต่อไปนี้ในแต่ละไฟล์:
#!/bin/sh
git submodule update --init --recursive
เนื่องจากคุณถามชื่อแทนอย่างเจาะจงโดยสมมติว่าคุณต้องการมีสิ่งนี้สำหรับที่เก็บหลาย ๆ แห่งคุณสามารถสร้างนามแฝงที่เพิ่มสิ่งเหล่านี้ลงในที่เก็บของของ.git/hooks
คุณได้
core.hooksPath
สำหรับไดเรกทอรี hooksดูเอกสารสำหรับgit-config
รายละเอียดเพิ่มเติม
git pull --rebase
:(
นามแฝงตามที่เควินบัลลาร์ดแนะนำเป็นทางออกที่ดีอย่างสมบูรณ์แบบ เพียงแค่โยนตัวเลือกอื่นออกไปคุณสามารถใช้ตะขอหลังที่ทำการรวมซึ่งทำงานgit submodule update [--init]
ได้ง่าย
คุณสามารถสร้างนามแฝงสำหรับคำสั่ง git ที่จัดการการปรับปรุง submodule โดยอัตโนมัติ เพิ่มต่อไปนี้ใน. bashrc ของคุณ
# make git submodules usable
# This overwrites the 'git' command with modifications where necessary, and
# calls the original otherwise
git() {
if [[ $@ == clone* ]]; then
gitargs=$(echo "$@" | cut -c6-)
command git clone --recursive $gitargs
elif [[ $@ == pull* ]]; then
command git "$@" && git submodule update --init --recursive
elif [[ $@ == checkout* ]]; then
command git "$@" && git submodule update --init --recursive
else
command git "$@"
fi
}
ตามที่คนอื่นพูดถึงคุณสามารถตั้งค่านี้ด้วย:
git config --global submodule.recurse true
อย่างไรก็ตามหากคุณต้องการฉันและมีการ.gitconfig
ตั้งค่าที่ซับซ้อนมากขึ้น( ~/.gitconfig
ไฟล์หลักของฉันใช้include
ในการโหลด.gitconfig
ไฟล์อื่น ๆ) และคุณไม่สามารถจำวิธีการแปลงระหว่างgit
รูปแบบการกำหนดค่าบรรทัดคำสั่งและ.gitconfig
รูปแบบนี่คือวิธีการเพิ่ม ไปยัง.gitconfig
ไฟล์ใด ๆ ของคุณ:
[submodule]
recurse = true
วิธีเดียวที่ฉันจะได้รับ submodules และซ้อน submodules เพื่ออัปเดต:
git submodule update --remote --merge --recursive; git submodule foreach --recursive "(git add .; git commit -m 'SubmoduleSync'; git push; git pull;);" git add .; git commit -m 'SubmodulesSynced'; git push; git pull;
ฉันพยายามสร้างนามแฝงผ่านทางเทอร์มินัลเนื่องจากวงเล็บดังนั้นฉันจึงต้องเพิ่มสิ่งนี้ลงใน. gitconfig สำหรับทั่วโลก:
[alias] supdate = "!git submodule update --remote --merge --recursive; git submodule foreach --recursive '(git add .; git commit -m 'SubmoduleSync'; git push; git pull;);' git add .; git commit -m 'SubmodulesSynced'; git push; git pull;"
คำแนะนำสำหรับวิธีการเรียกใช้คำสั่งหรือนามแฝงโดยอัตโนมัติ?