Bagaimana menjaga "dot file" di bawah kontrol versi?

30

Etckeeper adalah alat yang hebat untuk melacak perubahan pada file konfigurasi Anda /etc. Beberapa hal penting tentangnya sangat menonjol. Ini dapat digunakan dengan berbagai macam VCS: git, mercurial, darcs, atau bzr. Itu juga tidak otomatis dilakukan setiap hari dan setiap kali Anda menginstal, menghapus atau meningkatkan paket. Itu juga melacak izin file dan metadata kepemilikan pengguna / grup.

Saya juga ingin menyimpan "file dot" saya di direktori home saya di bawah kontrol versi juga, lebih disukai bazaar. Apakah ada yang tahu jika ada alat seperti penjaga dll ada untuk tujuan ini?

Kasus terburuk, saya membayangkan bahwa cron pekerjaan sederhana berjalan bzr add && bzr cisekali atau dua kali sehari bersama dengan menambahkan ~/Documents, ~/Music, dll untuk .bzrignore Siapapun sudah melakukan sesuatu yang mirip dengan script?

Meskipun saya lebih suka bazaar, opsi lain mungkin menarik.

andrewsomething
sumber
4
Diskusi terkait di Unix Stack Exchange: Kiat untuk menempatkan ~ di bawah kendali sumber . Itu tidak menjawab pertanyaan Anda, tetapi tetap dapat memberikan informasi yang bermanfaat.
Gilles 'SO- stop being evil'
1
Ada banyak alat untuk ini sekarang. Lihat dotfiles.github.io di bawah bagian "Utilitas dotfile tujuan umum".
Robin Green
@RobinGreen Jika Anda berhasil menjawabnya dengan benar, saya bisa menerimanya. bzrtentu bukan cara untuk pergi pada tahun 2015.
andrewsomething

Jawaban:

7

Saya tidak tahu apakah ada sesuatu yang melakukan ini jadi saya membuat beberapa kode untuk mencapai apa yang Anda inginkan dengan menggunakan repositori saya di sini: http://github.com/robertmassaioli/config-files

Saya memiliki file yang mengatakan di mana semua file berada dan program generate_links menempatkan semuanya di sana. Jika Anda tahu apa yang Anda lakukan dan dapat mengkompilasi beberapa kode Haskell maka itu sangat sederhana dan mudah. Meskipun diperingatkan bahwa itu benar-benar dibuat untuk penggunaan pribadi saya.

Robert Massaioli
sumber
3
+1 untuk haskell! -1 untuk haskel! lol. tidak, tapi sungguh.
Derek
Aku mendengarmu. Saya memilih Haskell karena saya sedang mempelajarinya, mungkin atau mungkin bukan bahasa yang paling cocok untuk pekerjaan itu. :)
Robert Massaioli
3

Yah, saya pergi ke depan dan melakukan ini secara manual sampai saya menemukan solusi yang lebih baik. Jadi saya bisa menjelaskan apa yang saya lakukan.

Pertama saya melakukan bzr init ~, tetapi hal berikutnya yang saya lakukan adalah bzr ignore "*". Saya memutuskan bahwa saya tidak ingin menyimpan semuanya di bawah kendali versi. Itu tidak layak, terutama ketika Anda mempertimbangkan bahwa ada beberapa hal di sana yang Anda benar-benar tidak boleh simpan dalam vcs seperti kunci Anda. Jadi saya kemudian harus ke bzr addfile spesifik yang saya inginkan. Anda juga dapat menambahkan pengecualian ke .bzrignore. Ekspresi reguler python juga berguna di sana. Saya menjaganya agar tetap ramping untuk saat ini. Jika semuanya berjalan dengan baik, saya dapat menambahkan semua ~/.configdan~/.gconf juga.

Saya juga menulis skrip cepat yang saya jalankan sebagai cron job. Ia memeriksa apakah file telah berubah, dan jika demikian juga melakukan komit:

#! /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
andrewsomething
sumber
Saya telah memilih jawaban saya sendiri saat pertama kali memposting ini, tetapi memutuskan untuk membatalkannya. Ini tentu bukan jawaban terbaik untuk pertanyaan ini pada tahun 2015.
andrewsomething
2

Saya mengubah seluruh ~direktori saya menjadi repositori Bazaar. Menyimpan metadata bukan masalah untuk file di direktori home: semuanya dimiliki oleh akun dan grup yang sama, dan bzrsudah menyimpan bit eksekusi.

Saya secara manual menambahkan "menarik" file ke dalamnya (saya tidak ingin, misalnya, koleksi musik saya atau cache firefox berada di bawah kontrol versi), tetapi jika Anda ingin mengotomatiskan ini dengan skrip, saya pikir itu solusi sederhana dari melakukan bzr add && bzr cipada direktori yang dipilih atau pada output dari suatu findperintah hanya akan melakukan pekerjaan itu.

Riccardo Murri
sumber
2

Saya menyimpan file zsh dan vim saya di git, memakai github, di repositori yang berbeda:

untuk zsh, misalnya, saya membuat ".zsh" dan memasukkan zshrc dan zshenv ke dalamnya, ditambah skrip untuk menautkan zshrc ke ~ / .zshrc dan zshenv ke ~ / .zshenv, sesuatu seperti ini.

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

jadi saya lakukan

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

untuk .vim, ini hampir sama, kecuali saya menggunakan submodules untuk plugin, dengan patogen, jadi saya menambahkannya di init.sh

git submodule init
git submodule update

dan ketika saya ingin menambahkan plugin vim, saya lakukan

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

sebagai contoh.

ok, itu akan membutuhkan kerja yang sedikit terlalu banyak jika Anda memiliki lebih dari beberapa titik dot yang ingin Anda kelola, tetapi tidak ada yang menghalangi Anda untuk menempatkan semuanya dalam direktori yang sama, atau dipisahkan oleh aktivitas (aktif untuk semua editor grafis, satu untuk aktivitas web ...) atau lebih. Lagi pula, itulah yang saya lakukan, jadi hanya dua sen saya :).

tshirtman
sumber
1

Saya menggunakan solusi yang tidak otomatis seperti dllkeeper (saya harus komit secara manual), tetapi telah bekerja dengan baik untuk saya. Ini tidak cukup dikembangkan seperti yang saya suka, tetapi berhasil.

Saya telah menulis utilitas saya sendiri yang mirip dengan GNU Stow , karena stow tidak melakukan semua yang saya inginkan. Saya menyebutnya Stow in Home . Saat dijalankan, ia mencari direktori bernama "HOME". Kemudian mengambil semua yang ada di bawah direktori itu dan menghubungkannya ke lokasi yang sesuai di $ HOME, membuat direktori yang diperlukan. Ini juga akan menerjemahkan nama file - jika file dimulai dengan '_', itu akan diganti dengan '.'. Saya melakukan ini karena lebih baik untuk mengedit file dot saya ketika mereka tidak disembunyikan (lihat di daftar direktori secara default). Kemudian, itu akan menempatkan mereka dalam nama aplikasi mereka harapkan.

Jadi, saya punya beberapa repositori git untuk konfigurasi saya. Saya hanya meletakkan file dot yang saya edit secara pribadi di dalamnya. Keuntungan dari ini adalah saya dapat memiliki repositori untuk file dot yang dapat saya bagikan dengan orang lain (seperti konfigurasi Emacs saya) dan satu untuk orang lain yang bersifat pribadi (katakanlah, konfigurasi ssh saya, dengan nama host dan semacamnya untuk pekerjaan). Symlinking menempatkan dengan stow-in-home menempatkan semuanya di tempat yang tepat, tetapi kontrol sumber untuk masing-masing dapat terpisah.

Ini bekerja dengan baik untuk saya. Sebenarnya tidak ada alasan saya tidak dapat mengatur sesuatu untuk secara otomatis melakukan komitmen. Atau pindahkan semua file dot ke repositori yang sesuai dan masih menggunakan stow di rumah. Tapi beginilah cara saya melakukan sesuatu.

Travis B. Hartwell
sumber
0

Tidak bisakah Anda menambahkan dot fileske repositori yang digunakan di Etckeeper?

txwikinger
sumber
1
Bagaimana saya melakukannya? symlink semuanya ke suatu tempat di /etc?
andrewsomething
Ya .. itu adalah satu pilihan
txwikinger
0

Saya sudah melakukannya dengan menyalin semua dotfile saya, saya ingin tetap di bawah kontrol sumber ke folder yang disebut "dotfiles" di direktori / home / saya. Tentu saja ini berarti menyimpan duplikat dan menyalin bolak-balik bila perlu tetapi saya menemukan ini sebagai solusi termudah untuk diri saya sendiri.

Derek
sumber
1
alih-alih harus mengelola duplikat, tidak bisakah Anda membuat symlink ke dotfiles Anda?
Ryan
Saya pikir Anda pasti bisa!
Derek