言
Q:咳咳,為啥會(huì)用到Coding的SVN?
A:博主電腦上已經(jīng)配好一個(gè)coding的賬號(hào),且是全局的。網(wǎng)上搜索一臺(tái)電腦上配置兩個(gè)git賬號(hào)都是采用非全區(qū)的賬號(hào)的方法。這個(gè)coding是博主的第二個(gè)coding賬號(hào),全局的賬號(hào)不想動(dòng)他。于是嘗試下Coding的SVN服務(wù)。
食用方式
在項(xiàng)目的倉庫設(shè)置>開啟SVN服務(wù),藍(lán)后去下載小烏龜TortoiseSVN。不要點(diǎn)擊下面這個(gè),這個(gè)是服務(wù)器端的。一開始不清楚,踩一個(gè)坑
不要下載這個(gè)??!
去下載小烏龜tortoisesvn.net/downloads.html
安裝
打開這個(gè),SVN輸入地址(Coding上有)
輸入Coding賬號(hào)
登錄后就可以看到倉庫內(nèi)容了。
藍(lán)后直接把需要部署的代碼移進(jìn)去
后續(xù)
想覆蓋文件,報(bào)錯(cuò)。
想刪除文件,報(bào)錯(cuò)。
由于SVN不是很會(huì)用,這兩個(gè)坑踩的我一臉懵逼。讓后腦子終于開竅,想到了更好的解決小號(hào)coding代碼推送的方法。于是棄用SVN了233333~
關(guān)注關(guān)注求關(guān)注
ortoiseSVN 是 Subversion 版本控制系統(tǒng)的一個(gè)免費(fèi)開源客戶端,可以超越時(shí)間的管理文件和目錄。文件保存在中央版本庫,除了能記住文件和目錄的每次修改以外,版本庫非常像普通的文件服務(wù)器。你可以將文件恢復(fù)到過去的版本,并且可以通過檢查歷史知道數(shù)據(jù)做了哪些修改,誰做的修改。
首先安裝SVN客戶端,windows一般選擇烏龜客戶端:https://tortoisesvn.net/downloads.html。 根據(jù)系統(tǒng)位數(shù)選擇相應(yīng)客戶端進(jìn)行安裝。
假如項(xiàng)目已經(jīng)在服務(wù)器的倉庫里,那么現(xiàn)在你要做的就是把它檢出到本地。 首先創(chuàng)建一個(gè)空文件夾,用來存放項(xiàng)目源代碼。在空文件夾內(nèi)右鍵,選擇SVN檢出(SVN Checkout ...)菜單項(xiàng)。
在Checkout界面,填入項(xiàng)目的版本庫地址,選擇確定。
此時(shí)會(huì)彈出一個(gè)對話框讓你輸入賬號(hào)密碼,輸入你的賬號(hào)密碼即可。記得勾選保存認(rèn)證,不然每次操作都會(huì)讓你輸入。
此時(shí)在指定的目錄下就能看到checkout下來的項(xiàng)目代碼了。
SVN的修訂號(hào)是怎么回事?
svn commit 操作可以作為一個(gè)原子事務(wù)操作發(fā)布任意數(shù)量文件和目錄的修改。在你的工作副本中,你可以改變文件內(nèi)容,創(chuàng)建、刪除、改名和復(fù)制文件和目錄,然后作為一個(gè)整體提交。
在版本庫中,每次提交被當(dāng)作一次原子事務(wù)操作:要么所有的改變發(fā)生,要么都不發(fā)生,Subversion 努力保持原子性以應(yīng)對程序錯(cuò)誤、系統(tǒng)錯(cuò)誤、網(wǎng)絡(luò)問題和其他用戶行為。每當(dāng)版本庫接受了一個(gè)提交,文件系統(tǒng)進(jìn)入了一個(gè)新的狀態(tài),叫做版本,每個(gè)版本被賦予一個(gè)獨(dú)一無二的自然數(shù),一個(gè)比一個(gè)大,初始修訂號(hào)是 0,只創(chuàng)建了一個(gè)空目錄,沒有任何內(nèi)容。
可以形象的把版本庫(Repository)看作一系列樹,想象有一組版本號(hào),從 0 開始,從左到右,每一個(gè)修訂號(hào)有一個(gè)目錄樹掛在它下面,每一個(gè)樹好像是一次提交后的版本庫“快照”。
不像其它版本控制系統(tǒng),Subversion 的版本號(hào)是針對整個(gè)目錄樹的,而不是單個(gè)文件。每一個(gè)版本號(hào)代表了一次提交后版本庫整個(gè)目錄樹的特定狀態(tài),另一種理解是版本 N 代表版本庫已經(jīng)經(jīng)過了 N 次提交。
如何查看SVN上當(dāng)前代碼庫的最新版本號(hào)是多少?
打開右鍵菜單中的show log,然后看到一系列版本更新歷史,最上面的那一行,即是最新版本號(hào),所謂的head revision。
如何查看本地SVN管理的代碼庫的當(dāng)前版本號(hào)是多少?
打開右鍵菜單中的show log,然后看到一系列版本更新歷史,顯示為粗體的那一行即你本地當(dāng)前的版本。
如何將本地代碼庫的版本回退到某一個(gè)舊版本?
打開右鍵菜單中的update to revision 在彈出的對話框中進(jìn)行版本號(hào)指定即可,如果選擇head revision則更新為最新版本。
如果你更新了目錄中的文件,提交代碼需要用到commit功能,commit的功能不僅僅是上傳,他會(huì)和服務(wù)器上面的文件進(jìn)行對比,假如你更新了某個(gè)文件而服務(wù)器上面也有人更新了這個(gè)文件,并且是在你checkout之后做的更新,那么它會(huì)嘗試將你的更新和他人的更新進(jìn)行融合(merge),假如自動(dòng)merge不成功,那么報(bào)告conflict,你必須自己來手動(dòng)merge,也就是把你的更新和別人的更新無沖突的寫在一起。
commit的時(shí)候,最好填寫Log信息,這樣保證別人可以看到你的更新究竟做了寫什么。這就相當(dāng)于上傳文件并且說明自己做了那些修改,多人合作的時(shí)候log非常重要。
TortoiseSVN的commit只會(huì)上傳原先checkout然后又被修改了的文件,假如你新加入了某些文件,需要右鍵點(diǎn)擊文件選擇Add,然后文件上面會(huì)出現(xiàn)一個(gè)加號(hào),在下次commit的時(shí)候它就會(huì)被upload并且被標(biāo)記為綠色對勾。沒有綠色對勾的文件不會(huì)被commit。
TortoiseSVN圖標(biāo)不能顯示的解決方案?
右鍵->TortoiseSVN->setting->Icon Overlays->Status cache->default/Shell,然后重啟電腦。
TortoiseSVN的Settings窗口:
我們在日常使用中,最常用的是更新(SVN Update)和提交(SVN Commit)操作。這兩個(gè)步驟務(wù)必要非常熟練。
SVN數(shù)據(jù)與用戶備份
hotcopy 與 dump
Gzip壓縮與xz壓縮
在考慮磁盤空間緊張,內(nèi)存和CPU資源使用充足,可以使用xz壓縮,壓縮速度慢
在內(nèi)存和CPU資源使用緊張,不考慮磁盤容量大小,建議使用gzip壓縮,壓縮速度快
每一個(gè)月進(jìn)行全量備份,每隔8個(gè)小時(shí)進(jìn)行增量備份
本地備份目錄:/data/Backup/SVN
# 添加組backup
groupadd backup
# 添加用戶cory到組backup
usermod -a -G backup cory
# 更改/data權(quán)限
chmod -R 775 /data
# 更改/data/Backup的用戶組backup
chown -R root:backup /data/Backup
將dump出來的文件進(jìn)行備份
iF.SVNAdmin管理界面?zhèn)浞?/p>
此版本只是基礎(chǔ)版本,增量與全量備份未寫在其中,請知悉
#!/usr/bin/env bash
# TODO: Bup備份
# TODO: 其他備份目錄
# TODO: 軟編碼 IP 等
# TODO: 定期刪除
# TODO: 模塊編碼
# TODO: 增量備份與全量備份
set -e
password=$1
repo_dir="/svn/repos"
backup_dir="/data/Backup/SVN"
svnadmin="/usr/bin/svnadmin"
svnlook="/usr/bin/svnlook"
name=$(basename "$repo_dir")
revision=$($svnlook youngest "$repo_dir")
target="$backup_dir/$name-$revision.xz"
echo "$name-$revision.xz" > $backup_dir/currentBackup.info
if [ ! -e "$target" ]; then
rm -f "$backup_dir/$name"-*.xz
# nice $svnadmin dump -r $((revision_full + 1)):${latest_revision} --incremental --deltas --quiet "$repo_dir" | xz -T 0 --compress --stdout -9 --extreme > "$target"
# nice $svnadmin dump --quiet "$repo_dir" | xz -T 0 --compress --stdout -9 --extreme > "$target"
nice $svnadmin dump --deltas --quiet "$repo_dir" | xz -T 0 --compress --stdout -9 --extreme > "$target"
fi
# sync data
sshpass -p "${password}" rsync -arvP -e "ssh -p 22222" $backup_dir/currentBackup.info sailingadmin@192.168.10.11:/data/SVN/
# sync data
sshpass -p "${password}" rsync -arvP -e "ssh -p 22222" "$target" sailingadmin@192.168.10.11:/data/SVN/
# sync etc
sshpass -p "${password}" rsync -arvP -e "ssh -p 22222" /svn/etc sailingadmin@192.168.10.11:/data/SVN/
# sync svnadmin
sshpass -p "${password}" rsync -arvP -e "ssh -p 22222" /var/www/html/svnadmin sailingadmin@192.168.10.11:/data/SVN/
# delete
rm -rf $backup_dir/currentBackup.info
rm -rf "$target"
將備份在192.168.10.11目錄的過期文件定期刪除
通過Linux Crontab或者Jenkins都可以,如Crontab
#!/usr/bin/env bash
# TODO: Bup備份
# TODO: 其他備份目錄
# TODO: 軟編碼 IP 等
# TODO: 定期刪除
set -e
password=$1
repo_dir="/svn/repos"
backup_dir="/data/Backup/SVN"
svnadmin="/usr/bin/svnadmin"
svnlook="/usr/bin/svnlook"
name=$(basename "$repo_dir")
revision=$($svnlook youngest "$repo_dir")
target="$backup_dir/$name-$revision.xz"
echo "$name-$revision.xz" > $backup_dir/currentBackup.info
if [ ! -e "$target" ]; then
rm -f "$backup_dir/$name"-*.xz
# nice $svnadmin dump -r $((revision_full + 1)):${latest_revision} --incremental --deltas --quiet "$repo_dir" | xz -T 0 --compress --stdout -9 --extreme > "$target"
# nice $svnadmin dump --quiet "$repo_dir" | xz -T 0 --compress --stdout -9 --extreme > "$target"
nice $svnadmin dump --deltas --quiet "$repo_dir" | xz -T 0 --compress --stdout -9 --extreme > "$target"
fi
# sync data
sshpass -p "${password}" rsync -arvP -e "ssh -p 22222" $backup_dir/currentBackup.info sailingadmin@192.168.10.11:/data/SVN/
# sync data
sshpass -p "${password}" rsync -arvP -e "ssh -p 22222" "$target" sailingadmin@192.168.10.11:/data/SVN/
# sync etc
sshpass -p "${password}" rsync -arvP -e "ssh -p 22222" /svn/etc sailingadmin@192.168.10.11:/data/SVN/
# sync svnadmin
sshpass -p "${password}" rsync -arvP -e "ssh -p 22222" /var/www/html/svnadmin sailingadmin@192.168.10.11:/data/SVN/
# delete
rm -rf $backup_dir/currentBackup.info
rm -rf "$target"
準(zhǔn)備文件
Centos 7 安裝 SVN
crontab -e
# 每隔兩天刪除備份文件
# 刪除除當(dāng)前備份文件(從currentBackup.info讀取)以外的其他壓縮文件
# * * */2 * * cd /data/SVN && ls *.xz | grep -v $(cat currentBackup.info) | xargs rm -rf
sudo sed -i 's/^/#&/g' /etc/httpd/conf.d/welcome.conf
sudo sed -i "s/Options Indexes FollowSymLinks/Options FollowSymLinks/" /etc/httpd/conf/httpd.conf
sudo yum install -y subversion mod_dav_svn
sudo vi /etc/httpd/conf.modules.d/10-subversion.conf
最終內(nèi)容如下:
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
LoadModule dontdothat_module modules/mod_dontdothat.so
<Location /svn>
DAV svn
SVNParentPath /data/SVN
AuthName "SVN Repos"
AuthType Basic
AuthUserFile /etc/svn/svn-auth
AuthzSVNAccessFile /etc/svn/authz
Require valid-user
</Location>
創(chuàng)建SVN Repo
sudo mkdir /data/SVN
cd /data/SVN
sudo svnadmin create repos
sudo chown -R apache:apache repos
解壓全量備份包和增量備份包
sudo xz -d -T 0 repos-5083-Full.xz
sudo xz -d -k -T 0 repos-5098-Inc.xz
依次導(dǎo)入解壓出來的備份文件
sudo svnadmin load /data/SVN/repos < repos-5083-Full
sudo svnadmin load /data/SVN/repos < repos-5098-Inc
拷貝備份文件到SVN安裝時(shí)的配置文件路徑地址:
# AuthUserFile /etc/svn/svn-auth
# AuthzSVNAccessFile /etc/svn/authz
sudo /etc/svn
sudo cp /data/etc/svn/authz /etc/svn/
sudo cp /data/etc/svn/svn-auth /etc/svn/
sudo chown -R root:apache /etc/svn/
sudo chmod -R 670 /etc/svn/
sudo systemctl start httpd.service
sudo systemctl enable httpd.service
sudo firewall-cmd --zone=public --permanent --add-service=http
sudo firewall-cmd --reload
確認(rèn)已恢復(fù)到到對應(yīng)Revision:5098
拷貝svnadmin備份文件到/var/www/html中
sudo cp -rf /data/svnadmin /var/www/html/
sudo chmod -R 777 /var/www/html/svnadmin/data/
sudo chown -R apache:apache /var/www/html/svnadmin/
因?yàn)槲窗惭bphp相關(guān)軟件包,安裝完成,重啟即可
sudo yum install php
sudo systemctl restart httpd
SVN訪問以及IF.Svnadmin管理界面訪問
*請認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。