在linux下,各種軟件的配置文件大多存儲于以“.”開頭以“rc”結尾的文件中并存放于用戶的個人目錄~/中,也就是俗稱的dotfile或者rc file,例如zsh的配置文件.zshrc,vim的配置文件.vimrc等等。
當我們初次使用一些軟件時經常會花大量時間對相應的dotfile(rc file)進行配置,讓軟件以符合我們期望的方式工作,在使用時也時常會對dotfile進行調整。但是當我們希望在新電腦上恢復多個軟件配置或者在多臺電腦上共享一臺電腦對dotfile的修改時,逐一對各個dotfile進行管理非常不方便。
所以我來介紹一下我管理dotfile的方式
所需軟件介紹
我在管理dotfile時用到的軟件是在Github上開源的rc file management(rcm)軟件,這個軟件主要思想就是將所有你希望用rcm管理的dotfile移動并集中存儲在一個目錄中(默認是在~/.dotflies下),并在你的個人目錄下創(chuàng)建所有被rcm管理的dotfile的符號連接(symlink)。如果你熟悉這個軟件可以看看“我的日常使用方法”這一節(jié)的內容。
我們可以在該集中存儲目錄下建立git repository進行版本控制,同時也可托管到github或gitcafe上方便多臺機器共享。當你希望使用別人分享給你的rcm目錄下的dotfile時則rcm可以利用多目錄存儲管理功能,同時調用多個分享目錄下的文件。
這套軟件主要包括了一下4個命令和一個配置dotfile文件~/.rcrc(注意在安裝好rcm后不會有配置文件,若要使用需手動創(chuàng)建)
-
lsrc
:列出當前所有通過rcm管理的dotfile,以及其對應的符號鏈接位置 -
mkrc
:將指定的dotfile移動至你的集中存儲目錄,并在~/目錄下創(chuàng)建相應的符號鏈接 -
rcup
:根據(jù)rcm管理的dotfiles更新當前用戶目錄下已存在的符號鏈接或創(chuàng)建新的符號鏈接 -
rcdn
:刪除通過rcm創(chuàng)建的dotfile的符號鏈接
安裝RCM
我主要是用Mac和Ubuntu,他們的安裝方法如下
Mac
brew tap thoughtbot/formulae
brew install rcm
Ubuntu
sudo add-apt-repository ppa:martin-frost/thoughtbot-rcm
sudo apt-get update
sudo apt-get install rcm
Arch Linux
https://aur.archlinux.org/packages/rcm/
Debian-based
wget https://thoughtbot.github.io/rcm/debs/rcm_1.2.3-1_all.deb
sha=$(sha256sum rcm_1.2.3-1_all.deb | cut -f1 -d' ')
[ "$sha" = "fb8ec2611cd4d519965b66fcf950bd93d7593773659f83a8612053217daa38b4" ] && \
sudo dpkg -i rcm_1.2.3-1_all.deb
Gentoo-based (including Funtoo)
sudo emerge layman
sudo layman -f --overlays https://github.com/bronislav/overlays/raw/master/layman.xml --add bronislav
sudo emerge rcm
OpenBSD(-current)
sudo pkg_add rcm
openSUSE/RHEL/CentOS
http://software.opensuse.org/download.html?project=utilities&package=rcm
其他Linux發(fā)行版
這個軟件使用了標準GNU autotools,可以嘗試一下方法編譯安裝
curl -LO https://thoughtbot.github.io/rcm/dist/rcm-1.2.3.tar.gz && \
sha=$(sha256 rcm-1.2.3.tar.gz | cut -f1 -d' ') && \
[ "$sha" = "502fd44e567ed0cfd00fb89ccc257dac8d6eb5d003f121299b5294c01665973f" ] && \
tar -xvf rcm-1.2.3.tar.gz && \
cd rcm-1.2.3 && \
./configure && \
make && \
make install
RCM使用方法
接下來介紹一下我的使用方式
通過mkrc命令創(chuàng)建Dotfiles管理目錄
如果你是第一次在本地使用rcm,則可以通過mkrc命令來創(chuàng)建dotfiles管理目錄,并指定要用使用rcm管理哪些文件.
cd ~
mkrc .zshrc .zsh-custom
命令執(zhí)行完畢后,會將你指定的dotfile默認移動到/.dotfiles目錄下并重命名將文件名前的“.”去掉,同時在/目錄下創(chuàng)建相應的符號鏈接,如果你的dotfile是存儲在某個文件夾下時,例如~/.example/config, 則程序會將文件拷貝至~/.dotfiles/example/config,并在原目錄中創(chuàng)建符號連接
ls -l ~/dotfiles
-rw-r--r-- 1 Rain staff 1065 8 15 13:20 zshrc
drwxr-xr-x 3 Rain staff 102B 8 15 13:20 zsh-custom
cd ~
ls -l .zshrc
lrwxr-xr-x 1 Rain staff 35B 8 15 13:20 .zshrc -> /Users/Rain/.dotfiles/zshrc
ls -l .zsh-custom/themes/wty.zsh-theme
lrwxr-xr-x 1 Rain staff 61 8 15 13:20 .zsh-custom/themes/wty.zsh-theme -> /Users/Rain/.dotfiles/tag-zsh/zsh-custom/themes/wty.zsh-theme
此時你可以使用git在~/.dotfiles目錄下創(chuàng)建倉庫進行版本管理
cd ~/.dotfiles
git init
git add .
echo "These are my config dotfiles" >> README.md
git commit -m "initial commit"
如果你希望更改創(chuàng)建的dotfiles管理目錄的位置,可以通過在mkrc命令中帶上-d參數(shù),或者
在~/.rcrc配置文件中配置默認的目錄
mkrc -d ~/.mydotfiles .zshrc
#in ~/.rcrc file
#此參數(shù)可以設置多個目錄,為其余幾個命令服務,對mkrc命令來說第一個目錄為默認目錄,若不填寫則~/.dotfiles為默認目錄
DOTFILES_DIRS="~/.mydotfiles"
注意事項
由于rcm軟件的設計問題,請勿對已經由rcm管理并創(chuàng)建的符號連接使用mkrc命令,否則會讓~/.dotfiles下的文件變成指向自己的符號鏈接并丟失源文件。
為了避免符號鏈接帶來的問題,我們可以在使用mkrc命令時帶上“-C”參數(shù)來改變創(chuàng)建符號鏈接的行為,或者在~/.rcrc文件中加入如下參數(shù),將所有創(chuàng)建符號鏈接的行為都改為拷貝,這個將影響所有的rcm命令
#in ~/.rcrc files
COPY_ALWAYS="*"
mkrc -C .zshrc
我最開始嘗試使用這個軟件的時候因為這個問題導致丟失了.zshrc,而且并未備份,又得重新配置一遍,幸好有oh-my-zsh,Orz..
但是使用符號鏈接的好處就是當你對~目錄下我的dotfile進行修改時,相當于直接對dotfiles管理目錄中的文件進行了修改,這樣備份更加方便
,我認為只要小心一點還是符號鏈接更加方便,如何取舍就看大家啦。
mkrc命令高級用法
mkrc命令還支持將dotfiles通過tags分類存放,可以方便的對不同軟件的配置文件進行分類管理,比如通過如下命令創(chuàng)建dotfiles管理目錄,
cd ~
mkdir -t zsh .zshrc
此命令將會在./dotfiles目錄下創(chuàng)建以“tag-”開頭的目錄,效果如下
ls -l ~/.dotfiles/tag-zsh/zshrc
-rw------- 1 Rain staff 1065 8 15 15:42 .dotfiles/tag-zsh/zshrc
mkrc還能根據(jù)hostname來進行分類管理,mkrc的更多參數(shù)請查看man page mkrc(1)
在使用了mkrc的分類管理參數(shù)后會影響到接下來要介紹的rcup命令的行為
通過rcup命令更新dotfiles
基礎用法
當你沒有使用任何分類管理參數(shù)時,你的所有dotfile應該都存儲在/.dotfiles目錄下,此時你只需要簡單的執(zhí)行rcup命令,則rcm會在目錄下創(chuàng)建所有/.dotfiles下文件對應的符號鏈接,當配置了COPY_ALWAYS=“*”時則會改為拷貝,若目錄下存在對應文件且內容不同時,會提示是否覆蓋。且若、。dotfiles中的文件夾在中不存在時會自動創(chuàng)建,樣例如下
rcup -v
identical /Users/Rain/.rcrc
'~/.dotfiles/tag-zsh/zsh-custom/themes/wty.zsh-theme' -> '~/.zsh-custom/themes/wty.zsh-theme'
overwrite /Users/Rain/.zshrc? [ynaq] y
removed '/Users/Rain/.zshrc'
'/Users/Rain/.dotfile/zshrc' -> '/Users/Rain/.zshrc'
高級用法
當不加任何參數(shù)時,rcup默認只將沒有通過tag進行分類的且如果通過hostname分類了則分類hostname與本地hostname相同的dotfiles更新至你的~目錄
當你使用tag來構建你的dotefile目錄時,你可以通過給rcup命令加上“-t”參數(shù)或者在~/.rcrc中配置TAGS="tag1 tag2"來更新相應分類下的dotfiles,或者加上“-B”參數(shù)來指定一個hostname或在~/.rcrc文件中配置HOSTNAME參數(shù),從而取消自動計算hostname。
如果加了“-t”參數(shù)以后,lsrc,rcup和rcdn命令都只會加載沒有用tag分類的和“-t”參數(shù)給出的tag相關的dotfile,其他tag下的dotfiles不會被加載
你可以通過lsrc命令查看當前rcup命令能作用于哪些dotfiles,如果要查詢有哪些tag,只需進入~/.dotfiles目錄查看那些以“tag-”開頭的目錄即可。
lsrc
/Users/Rain/.rcrc:/Users/Rain/.dotfiles/rcrc
lsrc -t zsh
/Users/Rain/.rcrc:/Users/Rain/.dotfiles/rcrc
/Users/Rain/.zshrc:/Users/Rain/.dotfiles/tag-zsh/zshrc
rcup -v -t zsh
identical /Users/Rain/.rcrc
'/Users/Rain/.dotfiles/tag-zsh/zshrc' -> '/Users/Rain/.zshrc'
當你希望rcup同時載入多個dotfiles管理目錄,比如當你使用他人分享給你的通過rcm創(chuàng)建的dotfiles管理目錄時,你可以使用rcup的“-d”參數(shù)來指定從哪個文件夾來更新~目錄下的文件
rcup -d ~/.SarahDotfiles -t zsh
'/Users/Rain/Download/.SarahDotfiles/tag-zsh/zshrc' -> '/Users/Rain/.zshrc'
我的日常使用方法
一般我的使用方法是,使用一個dotfiles管理目錄統(tǒng)一管理dotfiles,并在該目錄里建立git repository進行版本控制
其中
- rcm的配置dotfiles .rcrc以tag rcm分類
- 同一個軟件的所有dotfile配置文件都通過一個tag來分類管理
- 在.rcrc中配置TAGS=“所有以用于分類的tags”
- 在.rcrc中配置EXCLUDES="忽略dotfiles管理目錄中的某些文件",比如github的README.md等
當遷移到新的電腦上時,將dotfiles管理目錄放置于~/.dotfiles,并采用如下方法
#1.恢復rcm的dotfile
rcup -t rcm
#2.查看當前有哪些可以恢復的dotfiles
lsrc
#3.因為.rcrc配置中已經配置了原電腦所有的分類,則可以直接全部恢復
rcup
#4.若只想部分恢復,則指定tag
rcup -t zsh
當使用別人分享過來的dotfiles管理目錄時,采用如下方法
#1.取消自己對應的配置
rcdn -t zsh -v
removed '/Users/Rain/.zshrc'
#2.將別人的對應配置符號連接過來,進行測試
rcup -d ~/.SarahDotfiles -t zsh
'/Users/Rain/Download/.SarahDotfiles/tag-zsh/zshrc' -> '/Users/Rain/.zshrc'
#3.如果不滿意則取消對方的配置,并重新鏈接回自己的配置
rcdn -d ~/.SarahDotfiles -t zsh
rcup -t zsh
#4.如果滿意則copy對方的配置到我的~目錄,在自己重建dotfiles管理目錄中對應的文件
rcup -d ~/.SarahDotfiles -t zsh -C
mkrc .zshrc
#5.使用git對自己的dotfiles管理目錄進行版本管理
更多使用方法請參考man page rcup(1), mkrc(1), rcdn(1), lsrc(1), rcrc(5)和rcm(7) quick start tutorial.
本文個人博客地址: http://wty.im/2015/08/14/use-rcm-to-manage-your-dotfile-rc-file/
Github: https://github.com/wty21cn/