- GNU Stow membolehkan anda memusatkan fail titik dalam satu repositori dan menghubungkannya ke sistem menggunakan pautan simbolik dengan cara yang bersih dan boleh diterbalikkan.
- Terdapat dua model organisasi utama: repositori bersatu dan pendekatan berasaskan pakej, dengan tahap modulariti yang berbeza.
- Menggabungkan Stow dengan Git memudahkan untuk membuat versi, membuat sandaran dan meniru konfigurasi merentasi berbilang mesin hanya dengan beberapa arahan.
- Amalan baik seperti menggunakan .stow-local-ignore, menghormati struktur direktori dan mengelakkan pencampuran fail sebenar dan pautan simbolik memastikan aliran kerja yang mantap.
Jika anda menggunakan Linux , macOS atau Termux pada Android setiap hari, lambat laun anda akan mengumpul banyak fail konfigurasi yang tersebar di seluruh direktori utama anda: .zshrc, .bashrc, .config, nvim, Hyprland, dll. Apabila anda hanya mempunyai satu komputer, anda boleh mengurusnya, tetapi sebaik sahaja anda bekerja dengan berbilang komputer atau pelayan, memastikan semua ini teratur menjadi cerita yang sama sekali berbeza.
Di sinilah GNU Stow memainkan peranan , pengurus pautan simbolik yang telah menjadi salah satu cara paling bersih, paling mudah dan paling boleh diterbalikkan untuk mengurus fail titik. Ia bukan satu-satunya pendekatan yang mungkin (alternatif wujud seperti repositori kosong Git, yadm, Chezmoi, Dotbot, dll.), tetapi falsafah minimalisnya sangat sesuai jika anda mahukan sesuatu yang berkuasa tanpa terlalu banyak kekecohan di sebalik tabir.
Apakah sebenarnya GNU Stow dan mengapa ia berguna untuk mengurus fail .dot?
GNU Stow pada asalnya merupakan "pengurus ladang symlink" : alat yang direka untuk mengatur berbilang "pakej" fail di satu tempat dan mendedahkannya dalam direktori lain menggunakan pautan simbolik. Walaupun ia direka untuk mengurus pemasangan perisian tempatan, komuniti dengan cepat menerimanya untuk mengendalikan fail titik kerana ia sesuai dengan peranannya.
Idea asasnya sangat mudah: anda menyimpan semua konfigurasi anda dalam satu repositori pusat (contohnya, ~/dotfiles) , distrukturkan seolah-olah ia akan berada dalam direktori $HOME anda, dan Stow akan menguruskan penciptaan pautan simbolik daripada direktori utama anda ke fail tersebut. Ini membolehkan anda membuat versi dengan Git, mengklonkannya pada berbilang mesin dan menghasilkan semula persekitaran anda dengan satu atau beberapa arahan.
Nota penting: Stow bukanlah "alat fail titik" dalam erti kata yang paling tepat ; ia tidak menyimpan keadaannya sendiri, menyelenggara pangkalan data, menggunakan templat atau menggunakan penyulitan. Ia hanya mencipta dan memadam pautan simbolik mengikut struktur direktori. Inilah sebabnya ia begitu mudah difahami dan dikembalikan.
Falsafah minimalis ini berbeza dengan penyelesaian yang lebih kompleks seperti Chezmoi, yang menambah templat, pengurusan rahsia, penyepaduan pengurus kata laluan dan aliran kerja yang lebih automatik. Dengan Stow, anda yang bertanggungjawab: semuanya berada dalam sistem fail dan repositori Git anda , tanpa sebarang lapisan perantaraan.
Kelebihan menggunakan Stow berbanding cara lain untuk mengurus fail titik
Sebelum Stow menjadi popular, ramai orang menguruskan fail titik mereka menggunakan "cp" dan "mv" : mereka akan menyalin konfigurasi secara manual antara komputer atau menyelenggara repositori yang memerlukan pengemaskinian berterusan. Mudah untuk berakhir dengan berbilang versi fail yang sama dan tidak tahu yang mana satu sebenarnya sedang digunakan.
Dengan Stow, semua fail "sebenar" berada dalam direktori dotfiles anda, dan direktori $HOME anda hanya mengandungi pautan simbolik . Ini bermakna apabila anda mengedit, contohnya, ~/.zshrc, anda sebenarnya mengubah suai fail di dalam repositori anda. Tiada pendua, tiada penyahsegerakan dan tidak perlu mengingati apa yang hendak disalin dan di mana.
Satu lagi kelebihan yang jelas ialah kebolehbalikan: jika anda ingin membatalkan apa yang telah dilakukan oleh Stow, jalankan sahaja “pakej stow -D” daripada folder dotfiles anda dan ia akan mengalih keluar semua pautan simbolik yang dibuat untuk pakej tersebut. Ia tidak memadam konfigurasi sebenar anda (yang kekal dalam repositori), ia hanya membersihkan pautan simbolik ke destinasi.
Tambahan pula, Stow berfungsi dengan lancar dengan Git: anda boleh membuat versi ~/dotfiles seperti repositori biasa , membuat commit, mencipta cabang, menggunakan GitHub atau GitLab untuk sandaran dan banyak lagi. Stow secara automatik mengabaikan folder .git semasa mencipta pautan, jadi anda tidak berisiko mengisi direktori $HOME anda dengan fail Git dalaman.
Akhir sekali, tidak seperti alat lain yang lebih berat, Stow biasanya tersedia pada mana-mana distro Linux dan juga pada macOS melalui Homebrew ; ia pada asasnya skrip Perl dengan sangat sedikit kebergantungan dan berfungsi dalam mana-mana persekitaran seperti UNIX.
Alternatif biasa: Git bare, yadm, Chezmoi, Dotbot…
Apabila anda mempertimbangkan untuk mengurus fail dot dengan serius, senarai pilihan yang sama biasanya muncul: repositori Git kosong, yadm, Dotbot, Chezmoi dan Stow . Setiap pendekatan mempunyai gaya dan khalayaknya sendiri, jadi adalah wajar untuk meletakkan Stow dalam ekosistem tersebut.
Kaedah repositori Git kosong melibatkan permulaan repositori tanpa pokok kerja yang berkaitan dan menggunakan alias Git supaya $HOME itu sendiri bertindak sebagai direktori kerja. Kelebihan: tiada pautan simbolik, Git berfungsi secara langsung pada fail sebenar anda, dan aliran arahan adalah sangat mudah. Ramai pengguna mengulas bahawa mereka terkejut dengan betapa mudahnya mengikuti tutorial gaya "DT" dan membuatnya berfungsi tanpa menyentuh sebarang pautan simbolik.
Sebaliknya, Chezmoi memberi tumpuan sepenuhnya kepada pengurusan dotfile lanjutan : templat untuk mengendalikan perbezaan antara mesin, penyepaduan dengan pengurus kata laluan, penyulitan fail dengan GPG atau AGE, cangkuk untuk menjalankan skrip semasa pemasangan, sokongan merentas platform yang mantap dan banyak lagi. Ia sesuai jika anda perlu mengurus rahsia, menyokong banyak sistem yang berbeza atau mengautomasikan pemasangan yang kompleks.
Stow berada pada tahap yang bertentangan: ia tidak tahu apa-apa tentang rahsia, templat atau skrip . Ia hanya mencipta pautan simbolik yang bersih. Bagi ramai pengguna, ini adalah satu kebaikan: kurang untuk dipelajari, kurang tingkah laku "ajaib" dan ketelusan yang lebih tinggi. Jika anda memerlukan logik bersyarat yang berat, Chezmoi mungkin lebih sesuai; jika anda hanya mahu memastikan konfigurasi anda teratur tanpa komplikasi, Stow ialah klasik yang sangat andal.
Terdapat juga alat seperti Yadm atau Dotbot yang mengautomasikan banyak tugas (termasuk menjalankan skrip pasca pemasangan, pengklonan repositori, memasang pakej, dll.). Walaupun begitu, ramai pembangun masih lebih suka Stow kerana ia mudah diaudit, berintegrasi dengan baik dengan aliran kerja Git sedia ada dan menyesuaikan diri dengan lancar pada persediaan minimalis dan persekitaran desktop yang lebih mencabar.
Pendekatan organisasi: repositori bersatu vs repositori berasaskan pakej
Apabila anda mula menggunakan Stow, salah satu keputusan pertama yang perlu anda buat ialah cara menstrukturkan repositori dotfile anda . Secara amnya, terdapat dua corak popular: pendekatan bersepadu dan pendekatan berasaskan pakej.
Dalam model bersepadu, repositori dotfiles anda kelihatan hampir sama dengan direktori utama anda: fail seperti .bashrc atau .zshrc dalam root, dan folder seperti .config/nvim atau .config/lazygit di dalamnya . Sesuatu seperti ini:
dotfiles-bersatu/
├── .bash_aliases
├── .bash_completion/
│ └── alacritty.bash
├── .bashrc
└── .config/
├── lazygit/config.yml
└── nvim/…
Dengan reka bentuk ini, anda memasukkan folder repo, jalankan `stow.` , dan tiba-tiba semua konfigurasi anda dipautkan ke direktori `$HOME` anda . Ia sangat mudah apabila anda ingin mengklon seluruh persekitaran anda ke mesin baharu dengan satu arahan dan tidak memerlukan banyak pembezaan antara mesin.
Pendekatan berasaskan pakej berfungsi secara berbeza: anda mencipta subdirektori untuk setiap "modul" atau aplikasi . Contohnya, satu untuk bash, satu untuk nvim, satu untuk lazygit, satu untuk zsh, satu untuk Hyprland, dan sebagainya. Setiap direktori mengandungi fail dengan laluan penuh yang akan ada dalam direktori $HOME anda. Sesuatu seperti:
pakej-dotfiles/
├── bash/
│ ├── .bash_aliases
│ ├── .bash_completion/alacritty.bash
│ └── .bashrc
├── lazygit/.config/lazygit/config.yml
└── nvim/.config/nvim/…
Dengan skema ini, anda boleh memutuskan pakej mana yang hendak "diaktifkan" pada setiap mesin: pada satu mesin anda menjalankan "stow bash nvim lazygit", pada mesin lain mungkin "stow zsh nvim" . Ini sangat berguna apabila bekerja dengan berbilang pengedaran (contohnya, Arch pada satu PC dan Fedora pada PC yang lain) atau dengan shell yang berbeza (fish pada satu mesin, bash pada mesin yang lain) dan anda ingin menyimpan semuanya dalam satu repositori, tetapi memilih apa yang hendak digunakan dalam setiap persekitaran.
Masalahnya? Ia agak rumit: anda tidak lagi boleh hanya menggunakan `stow` dan selesai dengannya; anda perlu mengingati pakej yang anda perlukan , atau mencipta skrip kecil untuk setiap mesin yang memanggil `stow` dengan kombinasi yang betul. Walaupun begitu, ramai pengguna lebih suka kawalan terperinci ini, terutamanya jika mereka mempunyai perisian yang sangat khusus pada setiap mesin.
Cara Stow berfungsi secara dalaman: konsep "pencerminan" direktori
Kunci untuk memahami Stow ialah sistem pencerminan direktorinya . Stow tidak meneka laluan; ia hanya melihat bagaimana fail disusun dalam "pakej" dan meletakkan pautan simbolik yang sepadan dalam direktori destinasi.
Contohnya, jika aplikasi menjangkakan konfigurasinya dalam:
~/.config/ghostty/
Modul anda di dalam ~/dotfiles sepatutnya mempunyai laluan relatif yang sama:
~/dotfiles/ghostty/.config/ghostty/
Apa-apa sahaja yang anda letakkan di dalamnya (contohnya, fail yang dipanggil config) akan dipautkan oleh Stow ke lokasi yang betul. Dengan cara ini, Ghostty akan terus membaca konfigurasinya daripada ~/.config/ghostty/config, tetapi fail tersebut sebenarnya akan menghala ke fail yang disimpan dalam repositori anda.
Corak ini diulang untuk mana-mana alat: Waybar akan mempunyai sesuatu seperti ~/dotfiles/waybar/.config/waybar/, Neovim ~/dotfiles/nvim/.config/nvim/ , dan sebagainya. Prosesnya sangat seragam, menjadikan penskalaan kepada lebih banyak program hampir mekanikal.
Untuk fail titik yang berada terus dalam $HOME (seperti ~/.gitconfig atau ~/.zshrc) logiknya adalah sama: dalam pakej git anda akan mempunyai fail .gitconfig dalam root , dan Stow akan menguruskan penciptaan pautan dalam direktori utama anda apabila anda menjalankan "stow git".
Langkah demi langkah: menyediakan repositori dotfiles dengan Stow
Aliran kerja biasa dengan Stow adalah mudah dan boleh diringkaskan dalam beberapa langkah yang jelas, baik pada Linux mahupun macOS. Perkara penting ialah membiasakan diri dengan fakta bahawa fail "sebenar" sentiasa berada di dalam repositori dan tidak berselerak di seluruh direktori utama anda.
Untuk bermula, cipta direktori tempat fail titik anda akan berada. Ramai orang menggunakan ~/.fail titik atau ~/fail titik ; namanya tidak penting.
mkdir -p ~/.dotfiles
cd ~/.dotfiles
Seterusnya, pindahkan fail konfigurasi sedia ada anda ke repositori . Contohnya, jika anda mempunyai fail .bashrc dalam direktori utama anda dan ingin mengurusnya dengan Stow, anda boleh melakukan perkara berikut:
mv ~/.bashrc ~/.dotfiles/.bashrc
Jika anda lebih suka pendekatan berasaskan pakej, daripada meninggalkan fail di root repo, anda akan meletakkannya dalam folder "bash", mengekalkan laluan penuh:
mkdir -p ~/.dotfiles/bash
mv ~/.bashrc ~/.dotfiles/bash/.bashrc
Prosedur dengan konfigurasi dalam fail .config adalah serupa: anda meniru struktur direktori dalam repositori . Contohnya, untuk Neovim anda mungkin mempunyai:
mkdir -p ~/.dotfiles/nvim/.config/nvim
mv ~/.config/nvim/* ~/.dotfiles/nvim/.config/nvim/
Sebaik sahaja fail berada dalam repositori anda, adalah idea yang baik untuk memadam atau menamakan semula fail asal dalam $HOME untuk mengelakkan konflik. Kemudian, Stow akan mencipta semula pautan simbolik dalam laluan tempat aplikasi menjangkakan untuk menemui konfigurasi mereka.
Pasang GNU Stow pada platform yang berbeza
Pemasangan Stow sedikit berbeza bergantung pada platform, tetapi secara amnya ia sangat mudah. Pada macOS, kaedah biasa adalah menggunakan Homebrew , pengurus pakej yang paling banyak digunakan pada sistem ini:
brew install stow
Dalam pengedaran Linux seperti Debian atau Ubuntu, pendekatan biasa adalah menggunakan apt :
sudo apt install stow
Pada Arch Linux dan derivatif, anda boleh menemuinya di repositori rasmi dan memasangnya dengan pacman tanpa banyak misteri:
sudo pacman -S stow
Setelah dipasang, anda akan mempunyai arahan "stow" dalam PATH anda. Tiada daemon atau perkhidmatan latar belakang, hanya binari yang berjalan apabila anda memerlukannya . Anda boleh mengesahkan bahawa semuanya berfungsi dengan betul dengan "stow --version" dan anda sudah bersedia.
Pada sistem yang anda sudah menggunakan alat seperti Oh My Zsh, Stow sangat sesuai: anda boleh menyimpan fail .zshrc dan konfigurasi plugin serta tema anda dalam repositori pusat anda dan menggunakan semuanya dengan beberapa arahan. Ramai pengguna dengan berbilang Mac atau campuran sistem Linux dan macOS melaporkan bahawa ini membolehkan mereka mempunyai shell dan gesaan yang sama di mana-mana sahaja.
Abaikan fail yang tidak diingini dengan .stow-local-ignore
Salah satu kelebihan Stow ialah sistem abaikannya. Secara lalai, Stow sudah mengabaikan fail kawalan versi tipikal tertentu seperti .git, .gitignore, .gitmodules, direktori CVS, direktori RCS, dan sebagainya. Walau bagaimanapun, terdapat situasi di mana anda memerlukan kawalan yang lebih khusus, contohnya, pada macOS dengan .DS_Store yang terkenal.
Stow membolehkan anda mencipta fail bernama .stow-local-ignore dalam direktori tempat anda menjalankan arahan. Fail ini menentukan corak mana yang harus diabaikan secara setempat. Sebaik sahaja anda menciptanya, anda berhenti menggunakan senarai abaikan lalai, jadi anda perlu menambahkannya sendiri dan memasukkan sebarang tambahan.
Satu contoh tipikal kandungan .stow-local-ignore akan merangkumi komen dan corak untuk konflik CVS, sandaran Emacs, fail kawalan versi dan akhirnya .DS_Store supaya Stow tidak mengadu atau cuba memautkan fail-fail yang dijana oleh Finder:
# Comentarios y líneas en blanco permitidas
RCS
.+,v
CVS
\.#.+
\.cvsignore
\.svn
_darcs
\.hg
\.git
\.gitignore
\.gitmodules
.+~
\#.*\#
^/README.*
^/LICENSE.*
^/COPYING
.DS_Store
Hasilnya, anda dapat mengelakkan Stow daripada cuba mencipta pautan ke fail yang tidak relevan sama sekali dan mengelakkan ralat yang menjengkelkan semasa menyimpan atau membuka pakej . Ini amat berguna jika anda kerap melayari repositori anda menggunakan antara muka grafik yang menjana fail tambahan.
Ingat bahawa fungsi abaikan Stow adalah bebas daripada fail .gitignore yang anda gunakan dalam repositori anda: yang pertama mengawal apa yang dipautkan, yang kedua mengawal apa yang diversikan . Antara kedua-duanya, anda boleh memperhalusi kelakuan Stow dan Git.
Penggunaan Stow Asas: memautkan dan menyahpautkan pakej konfigurasi
Dengan semuanya telah disediakan, operasi harian Stow adalah sangat mudah. Anda harus sentiasa menjalankan Stow dari dalam direktori repositori dotfiles anda , bukan dari $HOME atau laluan sewenang-wenangnya, supaya laluan relatif yang dijananya masuk akal.
Bayangkan anda sudah mempunyai modul yang dipanggil “ghostty” dalam ~/dotfiles/ghostty/.config/ghostty dengan fail konfigurasi anda. Sebaik sahaja ia berada dalam repositori, anda boleh menyimpannya dengan:
cd ~/dotfiles
stow ghostty
Arahan ini mencipta pautan simbolik pada sistem anda daripada ~/.config/ghostty ke fail yang terletak dalam ~/dotfiles/ghostty/.config/ghostty. Jika anda menjalankan "ls -l ~/.config/ghostty", anda akan melihat anak panah (->) yang menunjukkan sasaran setiap pautan simbolik , mengesahkan bahawa semuanya dipautkan dengan betul.
Jika anda lebih suka pendekatan seragam dan ingin memautkan semuanya sekaligus, anda boleh menjalankan "stow." dari root repo . Stow akan mentafsir setiap subdirektori sebagai pakej atau terus bekerja pada struktur jika ia rata dan mencipta pautan simbolik untuk semua yang sesuai.
Untuk membalikkan pakej tertentu, hanya panggil Stow dengan pilihan -D (untuk "padam" dalam terminologi alat). Contohnya:
cd ~/dotfiles
stow -D ghostty
Ini mengalih keluar pautan simbolik yang saya cipta untuk modul tersebut tanpa menjejaskan fail asal yang kekal dalam repositori. Ia merupakan cara yang sangat bersih untuk "menyahpasang" konfigurasi daripada mesin tertentu tanpa kehilangannya sepenuhnya.
Adalah penting untuk mengelakkan kesilapan yang sangat biasa: jangan jalankan Stow dari direktori utama anda atau mana-mana folder lain di luar repositori . Melakukannya berisiko mewujudkan pintasan di tempat yang tidak dijangka, menyesakkan direktori utama anda dengan fail yang tidak diingini. Sentiasa: `cd` ke repositori, kemudian `stow`.
Integrasikan Git dan GitHub ke dalam aliran kerja dotfile anda dengan Stow
Keindahan keseluruhan persediaan ini ialah menggabungkan Stow dengan Git supaya fail dot anda diversi, disandarkan dari jauh dan mudah direplikasi pada mesin lain . Prosesnya sangat mudah dan tidak berbeza dengan projek lain yang anda uruskan dengan Git.
Dari folder dotfiles anda, mulakan repositori baharu jika anda belum melakukannya:
cd ~/dotfiles
git init
Dari situ anda boleh menambah fail anda, membuat komitmen dan bekerja dengan cawangan seperti biasa. Titik permulaan yang mungkin ialah:
git add .
git commit -m "Primer commit de mis dotfiles"
Langkah seterusnya biasanya adalah untuk mencipta repositori pada GitHub, GitLab atau perkhidmatan lain dan menambahkannya sebagai alat kawalan jauh. Sesuatu seperti ini:
git remote add origin [email protected]:tuusuario/dotfiles.git
git push -u origin main
Perlu diingat bahawa walaupun sesetengah orang menerbitkan fail titik mereka dalam repositori awam, biasanya lebih baik menggunakan repositori peribadi jika anda mengendalikan data sensitif atau laluan yang boleh mendedahkan terlalu banyak maklumat peribadi. Walau apa pun, anda boleh menambahnya dengan penyulitan luaran untuk rahsia jika perlu.
Untuk memperhalusi apa yang akan diubah versinya, adalah juga idea yang baik untuk mempunyai fail .gitignore dalam repositori tempat anda menambah, contohnya, .DS_Store atau fail lain yang anda tidak mahu muat naik. Stow sudah mengabaikan fail .git, tetapi Git tidak tahu tentang .stow-local-ignore , jadi kedua-dua fail tersebut mempunyai tujuan yang berbeza dan saling melengkapi dengan baik.
Proses harian adalah sangat mudah: klon repositori dotfiles anda ke mesin baharu, pasang Stow, jalankan “stow.” atau “stow package1 package2…” dan persekitaran anda direplikasi . Jika anda kemudian menukar konfigurasi Neovim atau fail .zshrc anda, anda akan melakukan commit dan push, dan pada mesin lain, `git pull` mudah diikuti dengan `stow` sudah cukup untuk mengemas kini pautan jika anda telah menambah fail atau pakej baharu.
Penulis yang bersemangat tentang dunia bait dan teknologi secara umum. Saya suka berkongsi pengetahuan saya melalui penulisan, dan itulah yang akan saya lakukan dalam blog ini, menunjukkan kepada anda semua perkara yang paling menarik tentang alat, perisian, perkakasan, trend teknologi dan banyak lagi. Matlamat saya adalah untuk membantu anda mengemudi dunia digital dengan cara yang mudah dan menghiburkan.