- 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 menggunakannya Linux, macOS atau Termux pada Android Setiap hari, cepat atau lambat, anda akhirnya akan mengumpulkan banyak fail konfigurasi yang berselerak di seluruh laman web anda. direktori utama: .zshrc, .bashrc, .config, nvim, Hyprland, dsb. Apabila anda hanya mempunyai satu komputer, anda boleh terus hidup, tetapi sebaik sahaja anda bekerja dengan beberapa komputer atau pelayan, memastikan semua ini dikemas kini adalah cerita yang sama sekali berbeza.
Dalam konteks ini, perkara berikut memainkan peranan GNU Stow, pengurus pautan simbolik yang telah menjadi salah satu cara paling bersih, paling mudah dan paling boleh diterbalikkan untuk mengurus fail dot. Ia bukan satu-satunya pendekatan yang mungkin (terdapat alternatif seperti repositori Git bare, yadm, Chezmoi, Dotbot…), tetapi falsafah minimalisnya sangat sesuai jika anda mahukan sesuatu yang berkuasa tanpa terlalu banyak kekecohan di sebaliknya.
Apakah sebenarnya GNU Stow dan mengapa ia berguna untuk mengurus fail .dot?
GNU Stow, pada asalnya, ialah "pengurus ladang symlink"Alat yang direka untuk mengatur berbilang "pakej" fail di satu lokasi dan mendedahkannya dalam direktori lain menggunakan pautan simbolik. Walaupun ia direka untuk mengurus pemasangan perisian tempatan, komuniti dengan cepat menggunakannya untuk mengendalikan fail titik kerana ia sesuai dengan sempurna.
Idea asasnya sangat mudah: anda menyimpan semua tetapan anda dalam satu fail. repositori pusat (contohnya ~/dotfiles)Fail-fail ini distrukturkan seolah-olah ia akan berada dalam direktori utama anda, dan Stow akan menguruskan penciptaan pautan simbolik daripada direktori utama anda ke fail-fail tersebut. Ini membolehkan anda membuat versi dengan Git, mengklonkannya pada berbilang mesin dan menghasilkan semula persekitaran anda dengan satu atau beberapa arahan.
Sesuatu yang penting: Stow bukanlah "alat fail titik" dalam erti kata yang tepatIa tidak menyimpan keadaannya sendiri, menyelenggara pangkalan data, menggunakan templat atau menggunakan penyulitan. Ia hanya mencipta dan memadam pautan simbolik mengikut struktur direktori. Inilah sebabnya mengapa ia begitu mudah difahami dan dikembalikan.
Falsafah minimalis ini berbeza dengan penyelesaian yang lebih kompleks seperti Chezmoi, yang menambah templat, pengurusan rahsia, penyepaduan dengan pengurus kata laluan dan aliran kerja yang lebih automatik. Dengan Stow, anda yang bertanggungjawab: semuanya ada dalam sistem fail dan repo Git anda, tanpa lapisan perantaraan.
Kelebihan menggunakan Stow berbanding cara lain untuk mengurus fail titik
Sebelum Stow menjadi popular, ramai orang menguruskan fail titik mereka menggunakan arahan "cp" dan "mv".Konfigurasi disalin secara manual antara komputer, atau repositori dikekalkan yang memerlukan pengemaskinian berterusan. Mudah untuk mempunyai 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 simbolikIni bermakna apabila anda mengedit, contohnya, ~/.zshrc, anda sebenarnya sedang 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, padam semua pautan simbolik yang dibuat untuk pakej tersebut. Ini tidak memadam konfigurasi sebenar anda (yang kekal dalam repositori), ia hanya mengalih keluar pautan simbolik ke pakej sasaran.
Tambahan pula, Stow berfungsi dengan sangat baik dengan Git: Anda boleh versi ~/dotfiles seperti repositori biasaAnda boleh membuat komitmen, mencipta cabang, menggunakan GitHub atau GitLab sebagai sandaran, dan sebagainya. Stow secara automatik mengabaikan folder .git semasa menjana pautan, jadi anda tidak menghadapi risiko mengisi direktori $HOME anda dengan fail Git dalaman.
Akhir sekali, tidak seperti alat berat yang lain, Stow biasanya tersedia pada mana-mana distro Linux dan juga pada macOS melalui HomebrewIa pada asasnya skrip ditulis dalam Perl dengan sangat sedikit kebergantungan dan berfungsi dalam sebarang persekitaran UNIX.
Alternatif biasa: Git bare, yadm, Chezmoi, Dotbot…
Apabila anda mempertimbangkan untuk mengurus fail titik dengan serius, senarai pilihan yang sama biasanya muncul: Repositori Git “bare”, yadm, Dotbot, Chezmoi, dan StowSetiap pendekatan mempunyai gaya dan khalayaknya sendiri, jadi penting untuk meletakkan Stow dalam ekosistem tersebut.
Kaedah repositori Git kosong Ini 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 arahannya sangat mudah. Ramai pengguna mengulas bahawa mereka terkejut dengan betapa mudahnya mengikuti tutorial gaya "DT" dan membuatnya berfungsi tanpa menyentuh sebarang pautan simbolik.
Selain itu, Chezmoi memberi tumpuan sepenuhnya kepada pengurusan fail titik lanjutanCiri-ciri termasuk: 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 memerlukannya mengurus rahsia, menyokong pelbagai sistem yang berbeza atau mengautomasikan pemasangan yang kompleks.
Stow berada pada tahap yang bertentangan: Dia tidak tahu apa-apa tentang rahsia, templat atau skripIa hanya mencipta pautan simbolik yang bersih. Bagi kebanyakan pengguna, itu 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, sebilangan besar pembangun masih memilih 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 dotfiles andaSecara umumnya, terdapat dua corak popular: pendekatan bersepadu dan pendekatan berasaskan pakej.
Dalam model bersatu, repositori dotfiles anda mempunyai bentuk yang hampir sama dengan direktori $HOME anda: fail seperti .bashrc atau .zshrc dalam root, dan folder seperti .config/nvim atau .config/lazygit di dalamnyaSesuatu seperti ini:
dotfiles-bersatu/
├── .bash_aliases
├── .bash_completion/
│ └── alacritty.bash
├── .bashrc
└── .config/
├── lazygit/config.yml
└── nvim/…
Dengan reka bentuk ini, anda memasukkan folder repo, anda menjalankan menyimpan. dan tiba-tiba, Semua tetapan anda dipautkan ke direktori $HOME andaIa sangat mudah apabila anda ingin mengklon seluruh persekitaran anda ke mesin baharu dengan satu arahan dan tidak memerlukan banyak pembezaan antara sistem.
Pendekatan berasaskan pakej berfungsi secara berbeza: Anda mencipta subdirektori bagi setiap "modul" atau aplikasiContohnya, satu untuk bash, satu lagi untuk nvim, satu lagi untuk lazygit, satu lagi untuk zsh, satu lagi 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 yang lain mungkin “stow zsh nvim”Ini sangat berguna apabila anda 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.
Kesimpulannya? Ia agak rumit: "Stow" tidak lagi mencukupi. Dan itu sahaja; anda hanya perlu ingat pakej yang anda perlukan.Sebagai alternatif, anda boleh mencipta skrip kecil bagi setiap mesin yang memanggil Stow dengan kombinasi yang sesuai. Walaupun begitu, ramai pengguna lebih suka kawalan terperinci ini, terutamanya jika mereka mempunyai perisian yang sangat spesifik pada setiap mesin.
Cara Stow berfungsi secara dalaman: konsep "pencerminan" direktori
Kunci untuk memahami Stow ialah sistemnya mencerminkan struktur direktoriStow 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 berulang untuk sebarang 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 direktori rootStow kemudiannya akan mencipta 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 repo. dan tidak berselerak di seluruh $RUMAH anda.
Untuk bermula, cipta direktori tempat fail titik anda akan berada. Ramai orang menggunakannya ~/.dotfiles atau ~/dotfilesNama adalah perkara yang paling tidak penting:
mkdir -p ~/.dotfiles
cd ~/.dotfiles
Kemudian Pindahkan fail konfigurasi semasa anda ke repositoriContohnya, jika anda mempunyai fail .bashrc dalam direktori utama anda dan anda 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 yang terdapat di dalam .config adalah serupa: Anda meniru struktur direktori dalam repoContohnya, untuk Neovim anda boleh 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 keseluruhannya sangat mudah. Pada macOS, adalah perkara biasa untuk menggunakan Homebrew., pengurus pakej yang paling meluas pada sistem ini:
brew install stow
Dalam pengedaran Linux seperti Debian atau Ubuntu, amalan biasa adalah menggunakan apt:
sudo apt install stow
En Arch Linux dan derivatif, anda boleh menemuinya di repositori rasmi dan ia dipasang dengan Pacman tanpa banyak misteri:
sudo pacman -S stow
Setelah dipasang, anda mempunyai arahan "stow" dalam PATH anda. Tiada daemon atau perkhidmatan latar belakang, hanya binari yang berjalan apabila anda memerlukannya.Anda boleh menyemak sama ada semuanya berfungsi dengan betul dengan arahan "stow --version" dan anda sudah selesai.
Pada sistem yang anda sudah menggunakan alatan seperti Oh My Zsh, Stow sangat sesuai: anda boleh menyimpan fail .zshrc dan konfigurasi pemalam serta tema dalam repo pusat anda dan menggunakan semuanya dengan beberapa arahan. Ramai pengguna dengan beberapa Mac Atau, menggunakan campuran Linux dan macOS, mereka mengatakan bahawa dengan cara ini mereka berjaya mempunyai shell yang sama dan gesaan yang sama di mana-mana..
Abaikan fail yang tidak diingini dengan .stow-local-ignore
Salah satu perincian halus Stow ialah sistem abaikan. Secara lalai, Stow sudah mengabaikan fail kawalan versi tipikal tertentu seperti .git, .gitignore, .gitmodules, direktori CVS, RCS, dll. Walau bagaimanapun, terdapat situasi di mana anda memerlukan kawalan yang lebih khusus, contohnya pada macOS dengan .DS_Store yang terkenal.
Stow membolehkan anda membuat fail yang dipanggil .stow-local-ignore dalam direktori tempat anda menjalankan arahan. Fail tersebut 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 pada 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
Terima kasih kepada ini, anda menghalang Stow daripada cuba mencipta pautan fail yang tidak relevan sama sekali dan Anda mengelakkan kesilapan yang menjengkelkan semasa menyimpan atau menanggalkan bungkusanIni amat berguna terutamanya jika anda kerap melayari repositori anda menggunakan antara muka grafik yang menjana fail tambahan.
Ingat bahawa ignore Stow adalah bebas daripada .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 segala-galanya telah disediakan, operasi harian Stow menjadi sangat ringkas. Anda harus sentiasa menjalankan Stow dari dalam direktori repo dotfiles anda, bukan dari $HOME anda atau dari 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 menyebabkan pautan simbolik muncul pada sistem anda daripada ~/.config/ghostty ke fail yang terletak dalam ~/dotfiles/ghostty/.config/ghostty. Jika anda melakukan "ls -l ~/.config/ghostty", anda akan melihat cendawan (->) yang menunjukkan sasaran setiap pautan simbolik.mengesahkan bahawa semuanya dikaitkan dengan betul.
Jika anda memilih pendekatan bersepadu dan ingin menghubungkan semuanya sekaligus, Anda boleh menjalankan “stow.” dari akar repoStow akan mentafsir setiap subdirektori sebagai pakej atau terus mengusahakan struktur jika anda mempunyai yang 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
Itu mengalih keluar pautan simbolik yang telah saya buat untuk modul itu tanpa menyentuh fail asal yang masih dalam repositori. Ia merupakan cara yang sangat bersih untuk "menyahpasang" konfigurasi daripada mesin tertentu. tanpa kehilangan mereka sepenuhnya.
Adalah penting untuk mengelakkan kesilapan yang sangat biasa: Jangan jalankan Stow dari $HOME atau dari folder lain di luar repoJika anda melakukan ini, anda berisiko membuat pautan di tempat yang tidak dijangka dan berakhir dengan direktori utama anda yang berselerak dengan perkara yang tidak sepatutnya. 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 anda dotfiles diversikan, disandarkan dari jauh dan mudah direplikasi pada mesin lainProsesnya 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. Satu kemungkinan boot boleh jadi:
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 git@github.com:tuusuario/dotfiles.git
git push -u origin main
Perlu diingat bahawa, walaupun sesetengah orang menerbitkan fail titik mereka dalam repositori awam, Tindakan paling bijak adalah 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 .git dengan sendirinya, tetapi Git tidak tahu apa-apa tentang .stow-local-ignoreOleh itu, kedua-dua fail tersebut mempunyai tujuan yang berbeza dan saling melengkapi dengan baik.
Rutin harian sangat jelas: Anda mengklon repositori dotfiles anda ke mesin baharu, memasang Stow, jalankan “stow .” atau “stow package1 package2…” dan anda mempunyai persekitaran yang direplikasi.Jika anda kemudian menukar konfigurasi Neovim atau .zshrc anda, anda perlu melakukan commit dan push, dan pada mesin lain, git pull mudah diikuti oleh 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.