มีข้อผิดพลาดในการวาง $ HOME ในคอมไพล์แทนที่จะเชื่อมโยง dotfiles หรือไม่?


38

ฉันใช้เวลาหลายปีใน$HOMEการตรวจสอบไดเรกทอรีทั้งหมดของฉัน สิ่งนี้ได้รวม dotfiles และโปรไฟล์แอปพลิเคชันทั้งหมดของฉัน, สคริปต์, เครื่องมือและแฮ็กจำนวนมาก, โครงสร้างโฮมไดเร็กตอรี่พื้นฐานที่ฉันต้องการ, ไม่ใช่โครงการคี่บอลสองสามตัวและคลังเก็บข้อมูลแบบสุ่ม นี่เป็นสิ่งที่ดี ในขณะที่มันกินเวลา

แต่มันหลุดมือไปแล้ว การชำระเงินพื้นฐานเหมือนกันในหลาย ๆ ระบบ แต่ไม่ใช่ทุกอย่างที่เหมาะสมสำหรับเครื่องของฉัน มันไม่ได้เล่นด้วย distros ที่แตกต่างกัน

ฉันกำลังอยู่ในขั้นตอนการทำความสะอาดบ้าน - แยกข้อมูลออกจากที่ที่มันเป็นอยู่โดยแยกสคริปต์บางส่วนออกเป็นโปรเจ็กต์แยกกันแก้ไขลิงก์ที่เสียหายบางอย่างในสิ่งที่ควรเป็นแบบอัตโนมัติ ฯลฯ

ความตั้งใจของฉันคือการแทนที่subversionด้วยgitการชำระเงินระดับ$HOMEสูง แต่ฉันต้องการตัดสิ่งนี้ลงไปเป็นสิ่งที่ฉันต้องการในทุกระบบของฉันหมายถึง dotfiles ไดเรกทอรีบางตัวและสคริปต์พื้นฐานที่กำหนดเองบางส่วน

ในการอ่านออนไลน์ผู้คนจำนวนมากดูเหมือนจะทำสิ่งนี้โดยใช้วิธี symlink: โคลนเข้าไปในไดเรกทอรีย่อยจากนั้นสร้าง symlink จาก$HOMEในที่เก็บ หลังจากมี$HOMEเวอร์ชันเต็มของฉันภายใต้การควบคุมมานานกว่าทศวรรษฉันไม่ชอบแนวคิดของ aproach นี้และฉันไม่สามารถเข้าใจได้ว่าทำไมผู้คนถึงเกลียดชังวิธีชำระเงินตรงๆ มีข้อผิดพลาดที่ฉันต้องรู้เกี่ยวกับgitการชำระเงินระดับบนสุดโดยเฉพาะ$HOMEหรือไม่

ป.ล. ส่วนหนึ่งเป็นการออกกำลังกายด้วยการเขียนโปรแกรมที่ดีฉันยังวางแผนที่จะทำให้การชำระเงินรูทของฉันเป็นแบบสาธารณะบน GitHub มันน่ากลัวว่าข้อมูลความปลอดภัยที่ฉันได้รับอนุญาตให้รวบรวมในไฟล์ที่ควรจะแชร์ได้นั้นน่ากลัวแค่ไหนโดยไม่ต้องคิดอีกเลย! รหัสผ่าน WiFi, คีย์ RSA ที่ไม่ผ่านวลี ฯลฯ Eeek!


5
อยากรู้ว่าสิ่งใดที่นำไปสู่ความเชื่อที่ว่า $ HOME ควรจะแบ่งปันได้โดยไม่ต้องมีความคิดที่สอง‽แม้แต่กุญแจส่วนตัวที่เข้ารหัส RSA ก็ไม่ควรแชร์
Derobert

3
หากคุณกำลังพูดถึงการใส่เนื้อหาของโฮมไดเร็กตอรี่ของคุณเข้าไปในคอมไพล์หมายเหตุ: มันเป็นเรื่องยาก (แต่ไม่เป็นไปไม่ได้) ที่จะขุดผ่านประวัติของคอมไพล์และลบรายการที่ละเอียดอ่อนออกอย่างถาวร (git ถูกออกแบบมาเพื่อช่วยป้องกัน โปรดจำไว้ว่าเมื่อคุณสลับสาขาหรือเช็คเอาต์การแก้ไขก่อนหน้านี้gitจะเปลี่ยนสิทธิ์ของไฟล์ของคุณเป็น644หลังจากเช็คเอาต์ซึ่งไม่ดีสำหรับสิ่งต่าง ๆ เช่นคีย์ ssh ส่วนตัว อย่างไรก็ตามetckeeperเป็นทางออกสำหรับการใช้คอมไพล์ด้วยสิทธิ์สำหรับ / etc /
cwd

@derobert: ฉันตระหนักดีว่า ฉันไม่ได้พูดถึงการทำให้ $ HOME เป็นสาธารณะเพียงแค่ dotfiles และสคริปต์อำนวยความสะดวก นี่คือสิ่งที่ฉันได้ค้นหาสิ่งที่ไม่ได้เป็นของฉัน และใช่ฉันควรจะสามารถที่จะแบ่งปันของฉัน.zshrc, .vimrcและสิ่งที่คล้ายกันโดยไม่ต้อง sanitize พวกเขาครั้งแรก!
คาเลบ

4
หากคุณยังไม่เห็นให้ดูรายการvcs-home wiki และรายชื่อรับเมลซึ่งโดยทั่วไปแล้วผู้คนกำลังพูดถึงสิ่งนี้อย่างถ่องแท้ - วิธีรักษา $ HOME ของคุณไว้ภายใต้การควบคุมการแก้ไข
จิมปารีส

ฉันไม่รู้ว่าคุณสามารถเปลี่ยนพฤติกรรมของ git ได้อย่างไร แต่อย่างน้อยวิธีที่มันใช้งานได้นอกคลังเดเบียนมันค่อนข้างโลภมากเมื่อพูดถึงการค้นหาไฟล์ที่ถูกติดตาม / ไม่ได้ติดตาม / แก้ไขแล้วโดยอัตโนมัติ รู้สึกรับผิดชอบทุกไฟล์ mrb ระบุไว้นี้แล้ว บางครั้งฉันก็รู้สึกหงุดหงิดกับพฤติกรรมโลภนี้แม้จะอยู่ในโครงการขนาดเล็ก แต่ฉันก็ไม่ต้องการในไดเรกทอรีบ้านของฉัน ทำไมต้องใช้คอมไพล์? ฉันยังใช้ระบบเวอร์ชันเพื่อซิงค์ไฟล์การกำหนดค่าของฉันกับโฮสต์และฉันค่อนข้างพอใจกับ CVS เพราะมันง่ายมาก! Git นั้นมีประสิทธิภาพมากเช่นกัน
Bananguin

คำตอบ:


17

ใช่มีอย่างน้อยหนึ่งหลุมพรางที่สำคัญเมื่อพิจารณาการจัดการไดเรกทอรีบ้านว่าไม่กังวลกับgitsubversion

Git เป็นทั้งโลภและ recursive โดยค่าเริ่มต้น

การโค่นล้มจะไร้ความปราณีอะไรที่ไม่ทราบและจะหยุดการประมวลผลโฟลเดอร์ไม่ว่าจะขึ้นหรือลงจากเช็คเอาท์เมื่อถึงที่ไม่รู้จัก (หรือเป็นของที่เก็บอื่น) ในทางกลับกัน Git ยังคงเรียกใช้ซ้ำในไดเรกทอรีลูกทั้งหมดทำให้การตรวจสอบซ้อนกันมีความซับซ้อนมากเนื่องจากปัญหาเนมสเปซ เนื่องจากไดเรกทอรีในบ้านของคุณน่าจะเป็นที่ที่คุณเช็คเอาต์และทำงานกับแหล่งเก็บข้อมูลอื่น ๆ ของ Git การมีไดเรกทอรีบ้านของคุณเป็น Git นั้นแทบจะทำให้ชีวิตของคุณยุ่งเหยิงไปไม่ได้

ตามที่ปรากฎนี่เป็นเหตุผลหลักที่ทำให้คนชำระเงิน dotfiles ลงในโฟลเดอร์ที่แยกต่างหากแล้วเชื่อมโยงเข้ากับมัน มันทำให้การคอมไพล์จากทางเมื่อทำสิ่งอื่นใดในไดเรกทอรีเด็ก ๆ $HOMEของคุณ ในขณะที่นี่เป็นเรื่องของการตั้งค่าถ้าการตรวจสอบที่บ้านของคุณในการโค่นล้มมันจะกลายเป็นเรื่องของความจำเป็นถ้าใช้คอมไพล์

อย่างไรก็ตามมีวิธีแก้ปัญหาอื่น Git อนุญาตให้สิ่งที่เรียกว่า "รูทปลอม" ซึ่งเครื่องจักรที่เก็บข้อมูลทั้งหมดถูกซ่อนอยู่ในโฟลเดอร์สำรองที่สามารถแยกทางกายภาพออกจากไดเรกทอรีการทำงานการชำระเงิน ผลที่ได้คือชุดเครื่องมือ git จะไม่สับสน: มันจะไม่ได้ดูที่เก็บของคุณเพียงสำเนาการทำงาน โดยการตั้งค่าตัวแปรสภาพแวดล้อมสองคุณสามารถเคล็ดลับ git ที่จะหาสินค้าในช่วงเวลาเหล่านั้นเมื่อคุณจัดการไดเรกทอรีบ้านของคุณ หากไม่มีตัวแปรสภาพแวดล้อมในการตั้งค่าไม่มีใครฉลาดและบ้านของคุณดูเหมือนว่าเป็นไฟล์คลาสสิก

เพื่อให้กลอุบายนี้ไหลลื่นขึ้นเล็กน้อยมีเครื่องมือที่ยอดเยี่ยมอยู่ที่นั่น รายการ VCS บ้านทางไปรษณีย์ดูเหมือนว่าสถานที่ defacto ที่จะเริ่มต้นและเกี่ยวกับหน้ามีห่อสะดวกขึ้นจาก HOWTOs และประสบการณ์ของผู้คน ไปตามทางที่บางเครื่องมือเล็ก ๆ น้อย ๆ ที่ดีเช่นvcsh , นาย หากคุณต้องการเก็บไดเรกทอรีบ้านของคุณโดยตรงในคอมไพล์ vcsh เกือบจะต้องมีเครื่องมือ หากคุณแยกไดเรกทอรีหลักของคุณออกเป็น repostories หลาย ๆ หลังรวมvcshกับวิธีที่mrรวดเร็วและไม่สกปรกในการจัดการทั้งหมดในครั้งเดียว


2
แต่ทำไมไม่เพิ่ม '*' ลงในไฟล์. gitignore ของคุณ? วิธีนั้นจะไม่สนใจทุกสิ่งยกเว้นไฟล์ที่มีอยู่แล้วในที่เก็บและคุณสามารถเพิ่มไฟล์ใหม่git add -f <file>ได้
ALiX

@ALiX: เนื่องจากgitเครื่องมือจะยังคงคิดว่าคุณกำลังทำงานอยู่ที่บ้านของคุณแม้ว่าคุณจะอยู่ในไดเรกทอรีย่อยที่เป็น repo คอมไพล์แยกต่างหากสำหรับบางโครงการ วิธีแก้ปัญหานั้นจะทำให้ไดเรกทอรีบ้านทั้งหมดของคุณปิดการ จำกัด งานอื่น ๆ ทั้งหมด
Caleb

4
แต่ '*' ใน. gitignore ของคุณหมายความว่าไฟล์ทั้งหมดที่ไม่ได้อยู่ใน repo ที่บ้านของคุณจะถูกละเว้น และเมื่อคุณตรวจสอบ repo git ใหม่ในไดเรกทอรีย่อยบางอย่างทุกอย่างยังคงทำงานได้ตามที่คาดไว้ (ฉันคิดว่า) เท่าที่ฉันรู้เครื่องมือ git จะค้นหาไดเรกทอรี. git แรกในขณะที่เลื่อนลำดับชั้นของไดเรกทอรี ดังนั้นเมื่อทำงานในไดเรกทอรีย่อยจะใช้ที่เก็บ git ที่ถูกต้อง แน่นอนถ้าคุณใช้ตัวแปรสภาพแวดล้อมของคอมไพล์ฉันเดาว่าสิ่งต่าง ๆ อาจยุ่งเหยิง แต่อย่างอื่นฉันไม่เห็นว่าทำไมสิ่งนี้ไม่ทำงาน
ALIX

@ALiX ถูกต้อง repos git ที่ซ้อนกันนั้นทำงานได้ดีตราบใดที่คุณ gitignore ใน repo หลัก ฉันสงสัยว่าอะไรคือข้อเสียของวิธีการง่ายๆนี้นอกเหนือจากปัญหาที่อาจเกิดขึ้นกับตัวแปรสภาพแวดล้อมของ git
evanrmurphy

1
รับการทดลองกับสิ่งนี้ในวันนี้ ฉันคิดว่า/*ทำงานได้ดีกว่า*เพราะมันยังไม่สนใจทุกสิ่งโดยค่าเริ่มต้น แต่ทำให้เพิ่มไดเรกทอรีได้ง่ายขึ้นมาก แทนที่จะเป็นgit add -fฉันกำลังใช้!รูปแบบที่ได้รับการแก้ไขเช่น!/.vimrcและ!/.gitignore(สำหรับไฟล์. gitignore เอง) เพื่อรวมสิ่งต่าง ๆ ไว้ใน repo อย่างชัดเจน
evanrmurphy

14

ฉันไม่ต้องการให้ไดเรกทอรีภายในบ้านทั้งหมดของฉันถูกตรวจสอบในการควบคุมเวอร์ชันเพียงเพราะมันหมายถึงทุกไดเรกทอรีย่อยที่ฉันเข้าไปจะมีบริบทการควบคุมเวอร์ชันของไดเรกทอรีที่บ้านของฉัน คำสั่งเช่นgit checkoutนั้นจะมีการดำเนินการจริงในกรณีนั้นทำให้เกิดปัญหาหากฉันบังเอิญเรียกใช้บางสิ่งจากไดเรกทอรีที่ไม่ถูกต้องไม่ว่าจะเป็นของgitตัวเองหรือสคริปต์ที่เรียก git

นอกจากนี้ยังทำให้มีแนวโน้มที่จะเพิ่มบางสิ่งลงใน repo ที่คุณไม่ต้องการซึ่งจะไม่เป็นปัญหาเมื่อคุณเช็คอินทุกอย่าง แต่ตอนนี้กลายเป็นปัญหา เกิดอะไรขึ้นถ้าคุณเพิ่มไฟล์คีย์ส่วนตัว (โดยไม่ตั้งใจ) และผลักมันไปที่ GitHub?

ต้องบอกว่าฉันคิดว่าข้อเสียเปรียบหลักไม่ใช่ทางเทคนิคจริงๆ - แค่ต้องการช่วยฉันจากตัวเอง

สำหรับ symlinking: คุณสามารถโคลน repo ของคุณลงในไดเรกทอรีย่อยและมีสคริปต์ที่อัพเดต symlink ใด ๆ ที่จำเป็นต้องได้รับการปรับปรุง จำนวนของการบำรุงรักษาที่จำเป็นสำหรับสคริปต์นี้อาจเกินดุลประโยชน์ของการมีเลยแม้ว่า; การเชื่อมโยงกันอาจทำให้การทำงานน้อยลง

ด้วย symlink คุณสามารถทำการเพิ่มเติมเฉพาะ distro (หรือเฉพาะโฮสต์) ที่ได้รับการตรวจสอบในคอมไพล์ สคริปต์ symlink-update ของคุณจะไม่สนใจไฟล์ที่มีไว้สำหรับแพลตฟอร์มที่เข้ากันไม่ได้หรือโฮสต์อื่นและจะอัปเดตไฟล์ที่เหมาะสมเท่านั้น

สิ่งที่ต้องการ:

HOMEREPO=$HOME/homerepo
HOST=$(hostname)
UNAME=$(uname)

for dotfile in $HOMEREPO/shared/* $HOMEREPO/host-$HOST/* $HOMEREPO/uname-$UNAME/*
do
    target=$HOME/$(basename $dotfile)
    [ ! -r $target ] && ln -s $dotfile $target
done

ส่วนตัว: ฉันใช้ symlink และฉันไม่ symlink ไดเรกทอรี; เฉพาะไฟล์ภายใน สิ่งนี้ทำให้ฉันมีความยืดหยุ่นในการเปลี่ยนแปลงไซต์โลคัลในไดเรกทอรีเหล่านั้น (เช่นเพิ่ม / ลบไฟล์) การตั้งค่าบัญชีของฉันในระบบใหม่นั้นน่าเบื่อเพราะฉันต้องสร้าง symlink ใหม่ทั้งหมดด้วยมือ


gitคำสั่งใด ๆ ที่ฉันเรียกใช้อาจเป็นของโฮมไดเร็กตอรี่เองหรือจะถูกฝังอย่างน้อยหนึ่งอันในไดเรกทอรีที่ไม่ได้คอมมิท การใช้การsvnแยกโฟลเดอร์เดียวนี้ค่อนข้างมีประสิทธิภาพและไม่ได้สร้างปัญหาให้ฉันในทศวรรษ ย่อหน้าแรกของคุณบ่งบอกถึงสิ่งอื่น นี่เป็นความแตกต่างในวิธีการใช้gitงานจริงหรือ
คาเลบ

นอกจากนี้การตั้งค่าและสคริปต์ของฉันมีตรรกะตามเงื่อนไขสำหรับโฮสต์และแพลตฟอร์มที่ต่างกันอยู่แล้วดังนั้นการใช้สคริปต์เพื่อตั้งค่าลิงก์ต่าง ๆ เนื่องจากเงื่อนไขดูเหมือนจะไม่ได้รับผลประโยชน์มากนักจากการgitจัดการสาขาได้ง่าย ยังมีบางสิ่งที่ฉันขาดหายไปหรือสิ่งนี้กำลังจะเกิดความชอบ?
คาเลบ

3
การแยกโฟลเดอร์เดียวไม่ได้แยกในgit- ไม่แน่ใจsvn- แต่สำหรับตัวอย่างgit init foo && mkdir -p foo/bar/baz/spam && cd foo/bar/baz/spam && git status(หรือคำสั่ง git อื่น ๆ ) แสดงว่าคุณยังอยู่ในfooบริบทการควบคุมเวอร์ชัน
mrb

Configs & สคริปต์: ไม่ใช่ทุก dotfiles รองรับเงื่อนไขซึ่งเป็นเหตุผลที่ฉันแนะนำวิธีอื่น นี่คือเหตุผลทั้งหมดที่ฉันคิดว่าคนไม่ต้องการใช้การควบคุมเวอร์ชันสำหรับ$HOME- และการกำหนดเวอร์ชันไม่ได้มีคุณค่าสำหรับ dotfiles imo - แต่ท้ายที่สุดมันคือโฮมไดเร็กตอรี่ของคุณดังนั้นหากคุณต้องการใช้ git และสิ่งเหล่านี้ไม่ใช่ปัญหาสำหรับคุณ ไปเลย!
mrb

ขอบคุณสำหรับข้อมูล. จริงๆแล้วความคิดเห็นของคุณเกี่ยวกับคอมไพล์ไม่อนุญาตให้แยกเป็นบิตที่มีประโยชน์ที่สุด คุณอาจทำงานอย่างเด่นชัดในคำตอบของคุณ การโค่นล้มพฤติกรรมแตกต่างกันมากในจุดนั้นและที่สำคัญสำหรับกรณีการใช้งานนี้
คาเลบ

5

เพื่อให้มุมมองอื่น: ฉันมี $ HOME ภายใต้คอมไพล์ตั้งแต่บางครั้งตอนนี้และไม่พบข้อเสียใด ๆ เห็นได้ชัดว่าฉันไม่ซิงค์ repo คอมไพล์นี้กับ GitHub; ฉันใช้บริการที่มี repos ส่วนตัว ฉันยังไม่ใส่ไฟล์มีเดียหรือดาวน์โหลดหรือแพ็คเกจภายใต้การควบคุมคอมไพล์

  • git status เป็นรายการตรวจสอบ "สิ่งที่ต้องทำเพื่อทำความสะอาด"

  • ฉันมี~/tmpสิ่งชั่วคราวซึ่งได้รับการแต่งตั้ง

  • ฉันชอบที่จะเห็นในgit statusสิ่งที่ซอฟต์แวร์ที่ติดตั้งเมื่อเร็ว ๆ นี้กล้าที่จะเพิ่มใน $ HOME ของฉันและมักจะลบไฟล์เหล่านี้หรือแม้กระทั่งถอนการติดตั้งผู้กระทำผิด

  • ฉันเพิ่มไฟล์ท้องถิ่นที่มีประโยชน์จริงๆและ dirs ด้วยตนเอง.gitignoreซึ่งมีประโยชน์ 'รู้ว่าคุณทำอะไรเมื่อติดตั้งสิ่ง'

  • ถ้าฉันสร้าง VM ใหม่หรือติดตั้งพีซีเครื่องใหม่ฉันเพิ่งโคลนบ้านระยะไกลของฉันเป็น $ HOME และมีทุกอย่างที่ฉันต้องการอยู่ในมือทันที

  • สิ่งต่างๆเช่น vundle สำหรับปลั๊กอินกลุ่มนั้นไม่จำเป็นอีกต่อไป

ฉันไม่ชอบความซับซ้อน เมื่อฉันปรับแต่ง rcfile ใด ๆ ฉันเพียงแค่ทำมันกระทำและผลักดัน จากนั้นเป็นภาพสะท้อนฉันเข้าสู่ $ HOME ทุกวัน ๆ และมีการกำหนดค่าล่าสุดเสมอ มันง่ายมาก

เครื่องที่อยู่ภายใต้ระบบการปกครองนี้: แล็ปท็อปหน้าแรก, พีซีทำงาน, ทำงาน VM, รวมถึงเซิร์ฟเวอร์ระยะไกล 3 หรือ 4 ตัว


คุณมีเช็คเอาต์คอมไพล์อื่น ๆ ที่อยู่ในบ้านของคุณหรือไม่?
คาเลบ

ไม่ฉันใส่สิ่งอื่น ๆ ลงใน / work directory และอย่าลอกแบบเครื่องมือเล็ก ๆ เช่น vim pugins
gb

1
ฉันทำงานภายใน ~ / Sites และทำวิธีนี้เช่นกันไม่มีปัญหากับ repos git ที่ซ้อนกัน
philfreo

1
ฉันใช้การตั้งค่านี้มาระยะหนึ่งแล้ว ฉันมีสถานะ 'นามแฝง sq = git -uno' และไม่ต้องรำคาญกับ. gitignore (ทุกครั้งฉันมักจะดูที่ cruft ทั้งหมดแล้วพูดว่า "meh") ฉันไม่เคยมีปัญหากับ repos git ที่ซ้อนกัน ฉันมีเซิร์ฟเวอร์ส่วนตัวที่ฉันทำสิ่งgit init --bareที่ฉันผลักดันให้มากกว่า ssh (แม้ว่าฉันจะไม่ใส่รหัสผ่านใน repo ฉันมีไฟล์บันทึกย่อของฉันอยู่ที่นั่น)
unhammer

5

ฉันได้ลองทั้งสองอย่างแล้วและชอบวิธี symlinkในที่สุด:

  • ตรวจสอบไปทุกที่
  • make install
  • ออกจากระบบและลงชื่อเข้าใช้อีกครั้งเพื่อโหลดการตั้งค่า X

ข้อเสีย:

  • ต้องย้ายไฟล์ไปที่ repo ก่อนที่จะเพิ่ม
  • จำเป็นต้องรักษารายการลิงก์สัญลักษณ์ใน Makefile

ข้อดี:

  • ไม่จำเป็นต้องมีขนาดใหญ่.gitignore(ฉันมี 133 ~จุดไฟล์ในกล่องอูบุนตูต่ำต้อยของฉัน)
  • สามารถเก็บสคริปต์การบำรุงรักษาและ~สิ่งอื่น ๆที่เกี่ยวข้อง (เช่นMakefileและcleanup.sh) ให้พ้นทาง
  • เวอร์ชันสามารถควบคุมการตั้งค่าส่วนบุคคลและสาธารณะแยกกันได้

ข้อ จำกัด:

  • ซึ่งแตกต่างจาก @mrb ผมเพียง แต่สร้าง symlinks ~ใน นั่นทำให้การเชื่อมโยงนั้นง่ายและทำให้สังเกตเห็นไฟล์ใหม่ ๆ ได้ง่ายเช่น~/.vimค่า.gitignoreบำรุงรักษาน้อยมาก

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

แอปพลิเคชั่นเดียวที่ฉันรู้ซึ่งมี (หรืออย่างน้อยก็มี) ปัญหาเกี่ยวกับการจัดการ symlink คือพิดจิ้น - มันยังคงเขียนทับ symlink ของฉันด้วยไฟล์ธรรมดา


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

3

นี่คือสิ่งหนึ่ง: หากคุณพยายามทำgit rebase -i --rootและคุณได้เช็คอินในคอมมิชชัน.gitconfigแรกในที่เก็บแล้วคอมไพล์จะลบ.gitconfigไฟล์ชั่วคราวซึ่งจะทำให้ไม่สามารถดำเนินการรีบูตได้เนื่องจากต้องใช้ชื่อและอีเมลของคุณ ซึ่งจะถูกเก็บไว้ในไฟล์นั้น

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

ผมไม่ทราบว่าสิ่งที่เกิดขึ้นถ้าคุณทำgit rebase -i <commit>แทนและมีการตรวจสอบในการร่วมกันกับใดกระทำหลังจากที่.gitconfig<commit>

บางทีอาจจะเป็นทางออกที่ง่ายที่สุดคือการละเว้นจากการเพิ่มพื้นที่เก็บข้อมูลและแทนที่จะแสดงรายการไว้ใน.gitconfig.gitignore


2

นี่คือวิธีที่ฉันทำ:

  1. ติดตั้ง linux ที่สะอาด (ไม่จำเป็น แต่ทำให้ชีวิตน่าพึงพอใจมากขึ้นในขั้นตอนที่ 4)
  2. ติดตั้ง etckeeper
  3. วิ่งgit initในบ้านของคุณ
  4. สร้าง. gignignore และเพิ่มทุกอย่างที่ดูเหมือนว่ามันไม่สนใจคุณหรืออาจเปลี่ยนไปมาก ให้แน่ใจว่าจะเพิ่มสิ่งที่ชอบ*.cache, *.lockฯลฯ ผมไม่แนะนำให้เพิ่ม/*เพราะคุณจะไม่ได้รับการแจ้งเตือนโดยอัตโนมัติเมื่อมีสิ่งใหม่เข้ามาในบ้านของคุณ มันเป็นวิธีการบัญชีดำและบัญชีขาววิธีที่ฉันต้องการเก็บการตั้งค่าของฉันสำหรับซอฟต์แวร์ทั้งหมดยกเว้นสิ่งที่ระเหยได้และซอฟต์แวร์บางอย่างที่ฉันไม่สนใจ เมื่อคุณรวมเข้าด้วยกันในภายหลังโยกย้ายหรือเปรียบเทียบระบบการสามารถกระจายทุกอย่างได้นั้นค่อนข้างมีประโยชน์ คุณสามารถตั้งค่าระบบใหม่ของคุณได้เร็วกว่ามากหากคุณเพิ่งมี. bashrc และ dotfiles อื่น ๆ วิธีนี้คุณจะคงการกำหนดค่าที่คุณอาจกำหนดผ่าน GUI และไม่ทราบว่า dotfiles เก็บการตั้งค่าอย่างไร (ถ้ามันกลับกลายเป็นว่าคุณยอมรับไฟล์ที่ระเหยได้คุณยังสามารถบอกให้คอมไพล์ไม่ต้องเปลี่ยน)
  5. วิ่ง etckeeper init -d /home/username
  6. วิ่ง git commit -d /home/username
  7. ตั้งค่านามแฝงในเปลือกของคุณเพื่อให้บรรทัดคำสั่งที่ดีกว่าเช่น homekeeper checkout

เหตุผลในการใช้ etckeeper ก็คือมันจะเก็บข้อมูลเมตาเช่นสิทธิ์สำหรับไฟล์ของคุณ (ค่อนข้างสำคัญสำหรับบางสิ่งเช่นคีย์ ssh) ตอนนี้คุณควรมีตะขอการส่งข้อความล่วงหน้าซึ่งจะบันทึกข้อมูลเมตาโดยอัตโนมัติ ฉันไม่แน่ใจเกี่ยวกับการชำระเงินภายหลัง คุณควรใช้etckeeper checkout xxx -d /home/userฉันจะดูมันอีกเล็กน้อยและอธิบายคำตอบนี้อย่างละเอียด


-1

ปัญหาหลักของฉันเกี่ยวกับการใช้ Git ในโฮมไดเรกทอรีคือ Git ไม่ได้เก็บแอตทริบิวต์ของไฟล์เช่นการอนุญาตของไฟล์และการประทับเวลา สำหรับฉันมันเป็นเรื่องสำคัญที่จะต้องรู้ว่าเมื่อใดไฟล์ที่ถูกสร้างขึ้นนั้นอาจจะใช่หรือไม่ใช่สำหรับคุณก็ได้ นอกจากนี้การสูญเสียสิทธิ์ในไฟล์และไดเรกทอรีเช่น.sshมีปัญหา ฉันเข้าใจว่าคุณวางแผนที่จะ.sshไม่ใช้ Git แต่จะมีสถานที่อื่น ๆ ที่การอนุญาตอาจมีความสำคัญ (เช่นการสำรองข้อมูลเว็บไซต์ที่ไม่มีการบีบอัด)


นี่เป็นสิ่งที่ทำให้เข้าใจผิดหากไม่ใช่ความจริงผิด Git โดยค่าเริ่มต้นจะรักษาคุณสมบัติของไฟล์ไว้มากมายรวมถึงการอนุญาต ฉันได้รับ.sshใน git บางครั้งตอนนี้ไม่มีปัญหาสิทธิ์การรักษาความปลอดภัยที่เหมาะสมจะถูกเก็บไว้ สิ่งที่ไม่ได้ทำในการกำหนดค่าพื้นฐานคือรักษาความเป็นเจ้าของหรือการประทับเวลา แต่ถ้าสิ่งเหล่านี้เป็นปัญหาสำหรับกรณีการใช้งานเฉพาะมีปลั๊กอินที่สามารถจัดการคุณสมบัติเพิ่มเติมเหล่านี้เป็นส่วนหนึ่งของเวิร์กโฟลว์ปกติ (ดู metastore หรือ git-cache-meta)
Caleb

แม้ว่ามันจะไม่ได้เก็บไว้พวกมันจะเลวร้ายยิ่งไปกว่าการมีโฮมไดเร็กตอรี่ไม่ใช่ใน vcs? git จะไม่เขียนทับ mtimes อย่างแข็งขันเว้นแต่คุณจะขอให้เปลี่ยนไฟล์
poolie

-1

โซลูชันที่ใช้ git นั้นมีประโยชน์อย่างยิ่งหากคุณต้องการปรับใช้ไฟล์ของคุณกับเครื่องที่แตกต่างกันและอื่น ๆ อีกมากมายดังนั้นหากคุณมีชิ้นส่วนที่ใช้ร่วมกับเครื่องทั้งหมดและชิ้นส่วนเฉพาะสำหรับเครื่องบางประเภท คุณสามารถสร้างที่เก็บหลายแห่งและใช้เครื่องมือเช่นmultigitหรือvcshเพื่อโคลนพวกเขาบนไดเรกทอรีเดียวกัน (dir บ้านของคุณในกรณีนี้)


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