จะรักษา“ dot files” ไว้ภายใต้การควบคุมเวอร์ชันได้อย่างไร?


30

Etckeeper/etcเป็นเครื่องมือที่ดีสำหรับการติดตามการเปลี่ยนแปลงแฟ้มการกำหนดค่าของคุณ สิ่งสำคัญบางประการเกี่ยวกับมันโดดเด่นจริงๆ มันสามารถใช้กับ VCS ได้หลากหลาย: git, mercurial, darcs หรือ bzr นอกจากนี้ยังทำหน้าที่อัตโนมัติทุกวันและเมื่อใดก็ตามที่คุณติดตั้งลบหรืออัพเกรดแพ็คเกจ นอกจากนี้ยังติดตามการอนุญาตของไฟล์และข้อมูลเมตาความเป็นเจ้าของของผู้ใช้ / กลุ่ม

ฉันต้องการเก็บ "dot files" ไว้ในโฮมไดเร็กตอรี่ของฉันภายใต้การควบคุมเวอร์ชันเช่นกันโดยเฉพาะตลาดสด ไม่มีใครรู้ว่าเครื่องมือเช่น etckeeper มีอยู่เพื่อจุดประสงค์นี้หรือไม่?

กรณีที่เลวร้ายที่สุดที่ฉันคิดว่างาน cron อย่างง่ายที่ใช้bzr add && bzr ciครั้งเดียวหรือสองครั้งต่อวันพร้อมกับการเพิ่ม~/Documents, ~/Musicฯลฯ ให้กับ.bzrignore ทุกคนที่ได้ทำสิ่งที่คล้ายกับสคริปต์หรือไม่?

แม้ว่าฉันจะชอบตลาดสด แต่ตัวเลือกอื่นอาจน่าสนใจ


4
การอภิปรายที่เกี่ยวข้องที่ใช้ระบบปฏิบัติการยูนิกซ์ Stack แลกเปลี่ยน: เคล็ดลับสำหรับการวาง ~ ภายใต้การควบคุมแหล่งที่มา ไม่ตอบคำถามของคุณ แต่อาจให้ข้อมูลที่เป็นประโยชน์ได้
Gilles 'หยุดความชั่วร้าย'

1
มีเครื่องมือมากมายสำหรับตอนนี้ ดูdotfiles.github.ioในส่วน "ยูทิลิตี dotfile สำหรับจุดประสงค์ทั่วไป"
Robin Green

@ RobinGreen หากคุณตอบคำถามนั้นฉันก็ยอมรับได้ bzrไม่ใช่วิธีที่จะไปในปี 2015 แน่นอน
andrewsomething

คำตอบ:


7

ฉันไม่ทราบว่ามีสิ่งใดที่ทำเช่นนี้หรือไม่ดังนั้นฉันจึงใช้รหัสบางอย่างเพื่อให้ได้สิ่งที่คุณต้องการโดยใช้ที่เก็บของฉันที่นี่: http://github.com/robertmassaioli/config-files

ฉันมีไฟล์ที่บอกว่าไฟล์ทั้งหมดอยู่ที่ไหนและโปรแกรม generate_links ทำให้พวกเขาทั้งหมดอยู่ที่นั่น หากคุณรู้ว่าคุณกำลังทำอะไรและสามารถรวบรวมรหัส Haskell ได้ง่ายและสะดวก แม้ว่าจะถูกเตือนว่ามันถูกสร้างขึ้นมาเพื่อการใช้งานส่วนตัวของฉันเอง


3
+1 สำหรับ Haskell! -1 สำหรับ Haskel! ฮ่า ๆ. ไม่ แต่จริงๆ
ดีเร็ก

ฉันได้ยินคุณ. ฉันเลือก Haskell เพราะฉันเรียนรู้มันอาจจะใช่หรือไม่ใช่ภาษาที่ดีที่สุดที่เหมาะกับงาน :)
Robert Massaioli

3

ฉันไปข้างหน้าและทำสิ่งนี้ด้วยตนเองจนกว่าฉันจะพบทางออกที่ดีกว่า ดังนั้นฉันก็อาจอธิบายสิ่งที่ฉันทำ

ครั้งแรกที่ฉันได้แต่สิ่งต่อไปที่ผมทำก็คือbzr init ~ bzr ignore "*"ฉันตัดสินใจว่าฉันไม่ต้องการเก็บทุกสิ่งไว้ในการควบคุมเวอร์ชัน มันไม่คุ้มค่าโดยเฉพาะเมื่อคุณพิจารณาว่ามีบางสิ่งในนั้นที่คุณไม่ควรเก็บไว้ใน vcs เหมือนกุญแจของคุณ ดังนั้นฉันต้องไปbzr addยังไฟล์เฉพาะที่ฉันต้องการ คุณยังสามารถเพิ่มข้อยกเว้น.bzrignoreได้ การแสดงผลปกติของ Python ก็มีประโยชน์เช่นกัน ตอนนี้ฉันยังดูผอมอยู่ หากทุกอย่างไปฉันอาจเพิ่มทั้งหมด~/.configและ~/.gconfมากเกินไป

ฉันยังเขียนสคริปต์สั้น ๆ ที่ฉันทำงานเป็น cron มันตรวจสอบว่าไฟล์มีการเปลี่ยนแปลงหรือไม่และถ้าเป็นเช่นนั้นการกระทำอัตโนมัติ:

#! /bin/bash

set -e

TIME=$(date)
STATUS=$(bzr status)

if [ -n "$STATUS" ]; then
    if [ -n "$1" ]; then
         bzr ci ~ -m "$1"
    else
        bzr ci ~ -m "Automatic commit on $TIME"
    fi
fi

exit

ฉันเลือกคำตอบของฉันเองเมื่อฉันโพสต์ข้อความนี้เป็นครั้งแรก แต่ตัดสินใจที่จะเลิกทำเช่นนั้น แน่นอนว่าไม่ใช่คำตอบที่ดีที่สุดสำหรับคำถามนี้ในปี 2558
andrewsomething

2

ฉันเปลี่ยน~ไดเรกทอรีทั้งหมดเป็นที่เก็บ Bazaar การจัดเก็บข้อมูลเมตาไม่ได้เป็นปัญหาสำหรับไฟล์ในโฮมไดเร็กตอรี่: ทุกอย่างเป็นของบัญชีและกลุ่มเดียวกันและbzrเก็บบิตการดำเนินการแล้ว

ฉันเพิ่มไฟล์ "ที่น่าสนใจ" ด้วยตนเอง (ฉันไม่ต้องการเช่นคอลเลกชันเพลงของฉันหรือแคช firefox ให้อยู่ภายใต้การควบคุมเวอร์ชัน) แต่ถ้าคุณต้องการทำให้มันเป็นแบบอัตโนมัติด้วยสคริปต์ฉันคิดว่ามันเป็นวิธีง่ายๆ ทำbzr add && bzr ciในไดเรกทอรีที่เลือกหรือในผลลัพธ์ของfindคำสั่งจะทำงาน


2

ฉันเก็บไฟล์ zsh และ vim ของฉันไว้ใน git, ใส่ github, ใน repositories ต่างๆ:

สำหรับ zsh ตัวอย่างเช่นฉันสร้าง ".zsh" และใส่ zshrc และ zshenv ลงไปพร้อมกับสคริปต์เพื่อลิงก์ zshrc ไปที่ ~ / .zshrc และ zshenv ไปที่ ~ / .zshenv บางอย่างเช่นนี้

while true
do
read -p "do you want to link zshenv to ~/.zshenv (Y/N)" yn
case $yn in
    [Yy]*) ln -s ~/.zsh/zshenv ~/.zshenv; break;;
    [Nn]*) break;;
    *) echo "please answer yes or no";;
esac
done

while true
do
read -p "do you want to link zshrc to ~/.zshrc (Y/N)" yn
case $yn in
    [Yy]*) ln -s ~/.zsh/zshrc ~/.zshrc; break;;
    [Nn]*) break;;
    *) echo "please answer yes or no";;
esac
done

ดังนั้นฉันทำ

git clone git://git@github.com:tshirtman/.zsh
cd .zsh
./init.sh

สำหรับ. vim มันเกือบจะเหมือนกันยกเว้นฉันใช้ submodules สำหรับปลั๊กอินกับเชื้อโรคดังนั้นฉันจึงเพิ่มเข้าไปใน init.sh

git submodule init
git submodule update

และเมื่อฉันต้องการเพิ่มปลั๊กอินเป็นกลุ่มฉันจะทำ

git submodule add git://github.com/nathanaelkane/vim-indent-guides.git bundle/vim-indent-guides

ตัวอย่างเช่น.

ตกลงมันจะต้องใช้งานมากไปหน่อยถ้าคุณมีจุด dirs มากกว่าสองสามตัวที่คุณต้องการจัดการ แต่ไม่มีอะไรขัดขวางคุณให้ใส่ทั้งหมดใน dir เดียวกันหรือแยกจากกิจกรรม (สำหรับบรรณาธิการกราฟิกทั้งหมดหนึ่งสำหรับ กิจกรรมบนเว็บ…) หรือมากกว่านั้น อย่างไรก็ตามนั่นคือสิ่งที่ฉันทำดังนั้นเพียงแค่สองเซ็นต์ของฉัน :)


1

ฉันใช้โซลูชันที่ไม่อัตโนมัติเช่น etckeeper (ฉันต้องยอมรับด้วยตนเอง) แต่ทำงานได้ดีสำหรับฉัน มันไม่ค่อยพัฒนาเท่าที่ฉันชอบ แต่มันได้ผล

ฉันได้เขียนโปรแกรมอรรถประโยชน์ของตัวเองที่คล้ายกับGNU Stowเนื่องจาก stow ไม่ได้ทำทุกอย่างที่ฉันต้องการ ผมเรียกมันว่าStow ในบ้าน เมื่อวิ่งจะค้นหาไดเรกทอรีชื่อ "HOME" จากนั้นจะนำทุกอย่างภายใต้ไดเรกทอรีนั้นและเชื่อมโยงไปยังตำแหน่งที่สอดคล้องกันใน $ HOME สร้างไดเรกทอรีตามความจำเป็น นอกจากนี้ยังจะแปลชื่อไฟล์ - หากไฟล์เริ่มต้นด้วย '_' ไฟล์นั้นจะถูกแทนที่ด้วย '.' ฉันทำสิ่งนี้เพราะมันเป็นสิ่งที่ดีกว่าสำหรับการแก้ไขจุดไฟล์ของฉันเมื่อพวกเขาไม่ได้ถูกซ่อน (ดูพวกเขาในรายการไดเรกทอรีตามค่าเริ่มต้น) จากนั้นจะทำให้พวกเขาอยู่ในชื่อแอปพลิเคชันที่พวกเขาคาดหวัง

ดังนั้นฉันมีที่เก็บคอมไพล์หลายตัวสำหรับการตั้งค่าของฉัน ฉันใส่เฉพาะจุดไฟล์ที่ฉันแก้ไขเป็นการส่วนตัวเท่านั้น ข้อดีของการทำเช่นนี้คือฉันสามารถมีที่เก็บสำหรับไฟล์ dot ที่ฉันสามารถแบ่งปันกับผู้อื่นได้ (เช่นการกำหนดค่า Emacs ของฉัน) และอีกอันสำหรับผู้อื่นที่เป็นส่วนตัว (เช่นการกำหนดค่า ssh ของฉันพร้อมชื่อโฮสต์ symlinking ทำให้กับ stow-in-home ทำให้ทุกอย่างถูกที่ แต่การควบคุมแหล่งที่มาสำหรับแต่ละคนสามารถแยกจากกัน

มันทำงานได้ดีสำหรับฉัน ไม่มีเหตุผลจริงๆที่ฉันไม่สามารถตั้งค่าให้ทำอะไรโดยอัตโนมัติ หรือย้ายไฟล์ dot ทั้งหมดไปยังที่เก็บที่เหมาะสมและยังคงใช้ stow ในบ้าน แต่นี่คือสิ่งที่ฉันทำ


0

คุณไม่สามารถเพิ่มdot filesไปยังที่เก็บที่ใช้ใน Etckeeper ได้หรือไม่?


1
ฉันจะทำอย่างไร symlink พวกเขาทั้งหมดไปที่ไหนสักแห่งใน/etc?
andrewsomething

ดี .. นั่นเป็นตัวเลือกเดียว
txwikinger

0

ฉันทำได้โดยการคัดลอก dotfiles ทั้งหมดที่ฉันต้องการเก็บไว้ภายใต้การควบคุมซอร์สไปยังโฟลเดอร์ที่เรียกว่า "dotfiles" ในไดเรกทอรี / home / ของฉัน แน่นอนว่านี่หมายถึงการทำสำเนาซ้ำและคัดลอกไปมาเมื่อจำเป็น แต่ฉันคิดว่านี่เป็นวิธีที่ง่ายที่สุดสำหรับตัวฉันเอง


1
แทนที่จะต้องจัดการรายการซ้ำคุณไม่สามารถสร้าง symlink ไปยัง dotfiles ของคุณได้หรือไม่
Ryan

ฉันคิดว่าคุณสามารถทำได้อย่างแน่นอน!
Derek

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