Saya ingin meletakkan direktori home saya (~) di bawah kontrol sumber (git, dalam hal ini), karena saya memiliki banyak file pengaturan (.gitconfig, .gitignore, .emacs, dll.) Di sana saya ingin membawa melintasi mesin, dan memiliki mereka di Git akan membuatnya bagus untuk mengambilnya.
Mesin utama saya adalah MacBook saya, dan cara mengatur OS X, ada banyak folder yang ingin saya abaikan (Dokumen, Unduhan, .ssh). Ada juga folder yang sudah menggunakan Git (.emacs.d).
Pikiran saya adalah menambahkan semua direktori ini ke file .gitignore saya, tapi itu agak melelahkan, dan berpotensi menyebabkan beberapa konsekuensi yang tidak terduga. Pikiran saya berikutnya adalah menyalin secara berkala file yang ingin saya simpan ke beberapa folder di rumah, kemudian melakukan folder itu. Masalahnya adalah saya harus ingat untuk memindahkan mereka sebelum melakukan.
Apakah ada cara bersih untuk melakukan ini?
sumber
Jawaban:
Saya punya di
$HOME
bawah git. Baris pertama file .gitignore saya adalahSisanya adalah pola untuk tidak mengabaikan menggunakan
!
pengubah. Baris pertama ini berarti defaultnya adalah mengabaikan semua file di direktori home saya. File-file yang ingin saya kontrol versi masuk.gitignore
seperti ini:Pola rumit yang saya miliki adalah:
Artinya, saya hanya ingin versi
.ssh/config
- Saya tidak ingin kunci dan file lain di .ssh masuk ke git. Di atas adalah bagaimana saya mencapainya.Sunting: Menambahkan garis miring untuk memulai semua jalur. Ini membuat pola abaikan cocok dari atas repositori ($ HOME) alih-alih di mana saja. Misalnya, jika
!lib/
suatu pola (jangan abaikan semua yang ada di direktori lib) dan Anda menambahkan file.gitignore
, sebelumnya pola (!.gitignore
) cocok dengan itu. Dengan slash terkemuka (!/.gitignore
), itu hanya akan cocok.gitignore
di direktori home saya dan tidak di subdirektori mana pun.Saya belum melihat kasus di mana ini membuat perbedaan praktis dengan daftar abaikan saya, tetapi bagi saya tampaknya lebih akurat secara teknis.
sumber
Apa yang saya lakukan (dengan tujuan yang sama) adalah meletakkan file konfigurasi saya di subdirektori
~/lib
dan memiliki tautan simbolik di direktori home saya, misalnya.emacs -> lib/emacs/dot.emacs
,. Saya hanya menyimpan file konfigurasi yang saya tulis secara eksplisit di bawah kontrol versi; direktori rumah saya berisi banyak file dot yang dibuat secara otomatis yang tidak di bawah kontrol versi. Dengan demikian di~/lib
bawah kontrol versi, dan direktori home saya tidak.Saya memiliki skrip yang membuat tautan simbolik dari file di bawah
~/lib
. Ketika saya membuat akun di mesin baru, saya mengisinya dengan memeriksa~/lib
dan menjalankan skrip itu.Pengalaman saya dengan CVS, bukan git, jadi tidak 100% dapat ditransfer. Salah satu alasan saya tidak menempatkan direktori home saya langsung di bawah CVS adalah itu
~/.cvsignore
akan berlaku untuk semua checkout CVS saya dan bukan hanya direktori home saya; git tidak memiliki masalah ini. Kelemahan dari pendekatan itu dibandingkan dengan memiliki direktori home di bawah kontrol versi adalah bahwa Anda tidak dapat menggunakangit status
untuk membedakan antara file yang Anda secara eksplisit memutuskan untuk abaikan (yang akan tercantum dalam file abaikan, jadi tidak ditampilkan) dan file yang Anda tidak memiliki pendapat tentang (yang akan ditampilkan dengan a?
).Beberapa file harus berbeda pada mesin yang berbeda. Saya menempatkan mereka di direktori yang disebut
~/Local/SITENAME/lib
dan baik membuat tautan simbolis untuk mereka juga atau (untuk format file yang mendukungnya) memiliki arahan sertakan dalam file di bawah~/lib
. Saya juga punya tautan simbolik~/Here -> ~/Local/SITENAME
. Karena git, tidak seperti CVS, dirancang untuk mendukung repositori yang sebagian besar mirip tetapi tidak identik, mungkin ada cara yang lebih baik untuk mengelola file khusus mesin. Beberapa file titik saya sebenarnya bukan tautan simbolis, tetapi secara otomatis dihasilkan dari konten di bawah~/lib
dan~/Here
.sumber
~/.gitignore
. Tanpa konfigurasi seperti itu, file tidak diterapkan ke repositori apa pun kecuali yang disimpan di~/.git
(bahkan kemudian tidak akan berlaku untuk sub-repositori). Saya menggunakan core.excludesfile =~/.git-user-excludes
untuk menghindari konflik antara pengecualian yang ingin saya terapkan ke semua repositori Git saya (terlepas dari lokasi) dan pengecualian yang ingin saya terapkan pada repositori yang menampung (sebagian) direktori home saya.gitignore
halaman manual: "Pola membaca dari file .gitignore di direktori yang sama dengan path, atau di direktori induk mana pun (...)" Apakah itu sebenarnya berhenti pada akar checkout (yaitu di mana yang.git
direktori)?.gitignore
file dibatasi oleh root dari pohon yang berfungsi. Kalimat yang Anda kutipkan berlanjut: "(hingga tingkat tertinggi pohon kerja)".Kita dapat menggunakan kemampuan Git untuk melanjutkan melacak file walaupun mereka terdaftar
.gitignore
. Jadi, ini cukup untuk.gitignore
:Untuk setiap file yang ingin Anda lacak, jalankan
add -f
(-f
parameter menimpa mengabaikan keduanya di.gitignore
dan.git/info/exclude
):Setelah mengindeks file, Git akan melacak semua perubahan meskipun faktanya file tersebut diabaikan. Hal yang sama berfungsi untuk direktori, tetapi hanya untuk file yang benar-benar ada:
Jika Anda ingin melacak seluruh direktori dengan semua file baru yang muncul di dalamnya, itu dapat dikecualikan dari
.gitignore
dengan cara, dijelaskan dalam jawaban oleh camh :Jika Anda ingin berhenti melacak file, perintah ini menghapus file dari indeks Git tetapi membiarkannya tidak tersentuh di hard drive:
sumber
Saya menggunakan yang lama
rcs
untuk itu.Silahkan lihat pada halaman manual untuk
ci
,co
, danrcs
. Situs-situs itu juga harus membantu:Saya menggunakannya untuk versi yang mengontrol dotfiles saya misalnya:
Dan jika saya ingin mengeditnya:
Saya sarankan membuat direktori bernama
RCS
di Anda~
, Anda kemudian dapat dengan mudah membuat cadangan direktori itu di suatu tempat.sumber
Saya memeriksa file konfigurasi saya
$HOME/.conf/
dari repositori BitBucket Mercurial. Repo GitHub juga bisa digunakan.The
~/.conf
checkout berisi file konfigurasi dan script shell untuk mengisi symlink di$HOME
setiap file dalam~/.conf
. Untuk format config yang mendukung inklusi (.bashrc
,.inputrc
,.vimrc
, dll) saya termasuk~/.conf
file yang bukan link untuk itu, sehingga saya bisa melakukan menimpa lokal.Untuk beberapa file konfigurasi, saya menyinkronkan ke file di folder Dropbox saya dan berbagi melalui dropbox.
Selama beberapa bulan saya mencoba menjaga
$HOME
dirinya sendiri dalam kontrol versi, tapi saya lelah mengelola daftar abaikan besar-besaran, saya lelah memeriksa perubahan konfigurasi yang dibuat dengan menjalankan aplikasi, dan hasilnya bahkan bukan sesuatu yang ingin saya periksa di komputer lain. Dapatkah Anda membayangkan memperbaiki konflik~/.gconf
atau~/.config/monitors.xml
, atau melayani berbagai versi aplikasi desktop?Saya merasa lebih mudah untuk melakukan symlink ke atau menyertakan daftar terbatas file konfigurasi yang telah saya sesuaikan secara pribadi dan ingin saya bagikan di seluruh mesin sebagai standar global.
sumber
Saya baru saja mulai menggunakan skrip Python Dotfiles berikut, yang merupakan alat praktis yang secara otomatis menautkan file untuk Anda: https://pypi.python.org/pypi/dotfiles
sumber
Saya pikir firasat kedua Anda untuk memiliki folder yang tidak terkait di bawah kendali sumber baik.
Tambahkan saja 2 skrip shell di sana. Satu untuk menyalin file di bawah kendali Anda ke
~
dan yang lain untuk mengumpulkan file dari~
dan menyalinnya kembali ke folder yang dikendalikan sumber dan komit.sumber
Ini adalah skrip ruby kecil yang saya gunakan untuk mengatur mesin baru
sumber