▩STRING THAT NEEDS TO BE CHANGED:
/mnt/scm/git 10.10.10.111 scm sample_repo
■ SVN 용어 설명
▒SVN의 기본 용어
⊙revision: 파일을 수정하여 커밋하면 숫자가 증가한다. 저장소에 저장된 파일 버전이라고 할 수 있다.
⊙trunk: 모두가 공유하는 작업공간이다.
⊙branch: 임시로 격리된 작업공간이다.
⊙tag: 목표가 달성되었을 때 완료 순간의 빌드를 저장하고 유지하는 것이다. 즉, 프로그램 개발 시 정기적으로 릴리즈할 때 릴리즈한 것을 따로 저장하는 공간이다.
▒SVN의 기본 커맨드
⊙import: 처음 1회, 버전관리를 하고자 하는 소스를 서버의 저장소에 넣는다.
⊙checkout: 처음 1회, 서버의 저장소에 보관된 소스를 로컬로 가져온다.
⊙export: 체크아웃과 달리 버전관리 파일을 뺀 순수한 소스만 가져온다. 소스를 압축하여 릴리즈할 때 사용한다.
⊙commit: 로컬에서 작업 후 변경된 소스를 서버의 저장소에 저장 및 갱신한다.
⊙update: 다른 사람이 변경하여 저장소와 로컬의 상태가 일치하지 않을 때, 최신상태를 유지하기 위해 서버의 저장소로부터 최신 소스를 가져온다. (체크아웃은 맨 처음 한 번, 업데이트는 수시로 하는 것)
⊙revert: 로컬에서 수정한 것을 취소한다. (서버와 상관없다)
⊙merge: 내가 작업한 branch와 다른 사람이 작업한 branch를 병합한다. 협업 시에 각각의 개발자는 브랜치 작업을 하고 난 후 svn 서버의 trunk에 공유하게 된다. 그러나 서로 같은 파일을 수정하게 되면 병합할 때 충돌이 날 수 있기 때문에 다음과 같은 병합과정을 거치게 된다.
▒SVN Port No: 3690/TCP
■ SVN 패키지 설치
apt update
apt -y install subversion subversion-tools libapache2-mod-svn libsvn-notify-perl
a2enmod dav
a2enmod dav_svn
###########################################################
#
# apache 서버를 이용하여 http(s) 서비스로 설치
#
###########################################################
1. apache2에 설치
cp -fv /etc/apache2/mods-enabled/dav_svn.conf /etc/apache2/mods-enabled/dav_svn.conf.orig
vi /etc/apache2/mods-enabled/dav_svn.conf
------------------------------------------------------------
<Location /svn>
DAV svn
SVNParentPath /mnt/scm/svn
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /etc/apache2/dav_svn.passwd
Require valid-user
</Location>
------------------------------------------------------------
systemctl restart apache2
2. htpasswd 사용자 추가
(신규) htpasswd -b -c "/etc/apache2/scm.passwd" svn svn
(사용자 추가) htpasswd -b "/etc/apache2/scm.passwd" svn svn
3. 접속 테스트
svnadmin create "/mnt/scm/svn/sample_repo"
https://10.10.10.111/svn/sample_repo
###########################################################
#
# svnserve를 이용하여 자체 대몬 서비스로 설치
#
###########################################################
1. svnserve를 systemd 서비스에 등록
printf "\n# Subversion\nexport SVN_EDITOR=/usr/bin/vi\n" >> ~/.profile
mkdir /var/log/svnserve
mkdir /var/run/svnserve
chown -R scm:scm /var/log/svnserve
chown -R scm:scm /var/run/svnserve
vi /usr/lib/systemd/system/svnserve.service
------------------------------------------------------------
[Unit]
Description=Subversion protocol daemon
After=syslog.target network.target
[Service]
Type=forking
Environment=SVN_EDITOR=/bin/vim
RuntimeDirectory=svnserve
PIDFile=/var/run/svnserve/svnserve.pid
ExecStart=/usr/bin/svnserve --daemon \
--config-file /etc/svnserve.conf \
--pid-file /var/run/svnserve/svnserve.pid \
--log-file /var/log/svnserve/svnserve.log \
-r /mnt/scm/svn
User=scm
Group=scm
KillMode=control-group
Restart=on-failure
[Install]
WantedBy=multi-user.target
------------------------------------------------------------
2. /etc/svnserve.conf 작성
vi /etc/svnserve.conf
------------------------------------------------------------
[general]
anon-access = none
auth-access = write
password-db = svnserve.passwd
authz-db = svnserve.authz
realm = SVN Repository
------------------------------------------------------------
3. /etc/svnserve.authz 작성
vi /etc/svnserve.authz
------------------------------------------------------------
[/]
svn = rw
------------------------------------------------------------
4. /etc/svnserve.passwd 작성
vi /etc/svnserve.passwd
------------------------------------------------------------
[users]
svn = svn
------------------------------------------------------------
※ID:svn, Password:svn
5. 퍼미션 조정 및 서비스 활성화
chown scm:scm /etc/svnserve.conf
chown scm:scm /etc/svnserve.passwd
chown scm:scm /etc/svnserve.authz
systemctl daemon-reload
systemctl enable svnserve.service
systemctl restart svnserve.service
6. 서버에 저장소 생성
rm -rf "/mnt/scm/svn"
mkdir -p "/mnt/scm/svn"
svnadmin create "/mnt/scm/svn/sample_repo"
svn mkdir --username svn --password svn -m "mkdir trunk" "svn://127.0.0.1/sample_repo/trunk"
svn mkdir --username svn --password svn -m "mkdir tags" "svn://127.0.0.1/sample_repo/tags"
svn mkdir --username svn --password svn -m "mkdir branches" "svn://127.0.0.1/sample_repo/branches"
chown -R scm:scm /mnt/scm/svn
###########################################################
#
# 윈도우 클라이언트 설정
#
###########################################################
1. 설정 편집
MKDIR %APPDATA%\Subversion
notepad %APPDATA%\Subversion\config.
------------------------------------------------------------
[miscellany]
enable-auto-props = no
[auto-props]
*.a = svn:mime-type=application/octet-stream
*.ai = svn:mime-type=application/octet-stream
*.apk = svn:mime-type=application/octet-stream
*.asm = svn:mime-type=application/octet-stream
*.attr = svn:mime-type=application/octet-stream
*.babelrc = svn:mime-type=application/octet-stream
*.bin = svn:mime-type=application/octet-stream
*.bmp = svn:mime-type=application/octet-stream
*.bnf = svn:mime-type=application/octet-stream
*.buildpath = svn:mime-type=application/octet-stream
*.cab = svn:mime-type=application/octet-stream
*.cer = svn:mime-type=application/octet-stream
*.cert = svn:mime-type=application/octet-stream
*.cgi = svn:mime-type=application/octet-stream
*.class = svn:mime-type=application/octet-stream
*.clonedeep = svn:mime-type=application/octet-stream
*.cms = svn:mime-type=application/octet-stream
*.coffee = svn:mime-type=application/octet-stream
*.com = svn:mime-type=application/octet-stream
*.cpb = svn:mime-type=application/octet-stream
*.crl = svn:mime-type=application/octet-stream
*.crt = svn:mime-type=application/octet-stream
*.cs = svn:mime-type=application/octet-stream
*.csr = svn:mime-type=application/octet-stream
*.css = svn:mime-type=application/octet-stream
*.csv = svn:mime-type=application/octet-stream
*.cur = svn:mime-type=application/octet-stream
*.d = svn:mime-type=application/octet-stream
*.dat = svn:mime-type=application/octet-stream
*.db = svn:mime-type=application/octet-stream
*.def = svn:mime-type=application/octet-stream
*.default = svn:mime-type=application/octet-stream
*.der = svn:mime-type=application/octet-stream
*.design = svn:mime-type=application/octet-stream
*.devconkeyset = svn:mime-type=application/octet-stream
*.doc = svn:mime-type=application/octet-stream
*.ec = svn:mime-type=application/octet-stream
*.editorconfig = svn:mime-type=application/octet-stream
*.egg-tmp = svn:mime-type=application/octet-stream
*.ejs = svn:mime-type=application/octet-stream
*.el = svn:mime-type=application/octet-stream
*.eot = svn:mime-type=application/octet-stream
*.eps = svn:mime-type=application/octet-stream
*.eslintignore = svn:mime-type=application/octet-stream
*.eslintrc = svn:mime-type=application/octet-stream
*.etc = svn:mime-type=application/octet-stream
*.exe = svn:mime-type=application/octet-stream
*.external = svn:mime-type=application/octet-stream
*.fdf = svn:mime-type=application/octet-stream
*.flow = svn:mime-type=application/octet-stream
*.flv = svn:mime-type=application/octet-stream
*.fun = svn:mime-type=application/octet-stream
*.fv1 = svn:mime-type=application/octet-stream
*.getownpropertydescriptors = svn:mime-type=application/octet-stream
*.gif = svn:mime-type=application/octet-stream
*.gitmodules = svn:mime-type=application/octet-stream
*.gypi = svn:mime-type=application/octet-stream
*.gz = svn:mime-type=application/octet-stream
*.hash = svn:mime-type=application/octet-stream
*.hbs = svn:mime-type=application/octet-stream
*.icc = svn:mime-type=application/octet-stream
*.id = svn:mime-type=application/octet-stream
*.iml = svn:mime-type=application/octet-stream
*.in = svn:mime-type=application/octet-stream
*.info = svn:mime-type=application/octet-stream
*.jar = svn:mime-type=application/octet-stream
*.jpg = svn:mime-type=application/octet-stream
*.jscsrc = svn:mime-type=application/octet-stream
*.jshintrc = svn:mime-type=application/octet-stream
*.jst = svn:mime-type=application/octet-stream
*.key = svn:mime-type=application/octet-stream
*.key_origin = svn:mime-type=application/octet-stream
*.keystore = svn:mime-type=application/octet-stream
*.kyobo = svn:mime-type=application/octet-stream
*.la = svn:mime-type=application/octet-stream
*.lib = svn:mime-type=application/octet-stream
*.lic = svn:mime-type=application/octet-stream
*.list = svn:mime-type=application/octet-stream
*.lock = svn:mime-type=application/octet-stream
*.ls = svn:mime-type=application/octet-stream
*.mailmap = svn:mime-type=application/octet-stream
*.man1 = svn:mime-type=application/octet-stream
*.map = svn:mime-type=application/octet-stream
*.markdown = svn:mime-type=application/octet-stream
*.md = svn:mime-type=application/octet-stream
*.mine = svn:mime-type=application/octet-stream
*.mjs = svn:mime-type=application/octet-stream
*.mli = svn:mime-type=application/octet-stream
*.mms = svn:mime-type=application/octet-stream
*.modules = svn:mime-type=application/octet-stream
*.msb = svn:mime-type=application/octet-stream
*.msi = svn:mime-type=application/octet-stream
*.msi_onlyAccount = svn:mime-type=application/octet-stream
*.node = svn:mime-type=application/octet-stream
*.node_repl_history = svn:mime-type=application/octet-stream
*.nofun = svn:mime-type=application/octet-stream
*.npmignore = svn:mime-type=application/octet-stream
*.num = svn:mime-type=application/octet-stream
*.nvmrc = svn:mime-type=application/octet-stream
*.nycrc = svn:mime-type=application/octet-stream
*.o = svn:mime-type=application/octet-stream
*.old = svn:mime-type=application/octet-stream
*.openssl = svn:mime-type=application/octet-stream
*.opt = svn:mime-type=application/octet-stream
*.orig = svn:mime-type=application/octet-stream
*.origin = svn:mime-type=application/octet-stream
*.ors = svn:mime-type=application/octet-stream
*.os6 = svn:mime-type=application/octet-stream
*.out = svn:mime-type=application/octet-stream
*.p12 = svn:mime-type=application/octet-stream
*.pbfilespec = svn:mime-type=application/octet-stream
*.pc = svn:mime-type=application/octet-stream
*.pcapng = svn:mime-type=application/octet-stream
*.pem = svn:mime-type=application/octet-stream
*.pfx = svn:mime-type=application/octet-stream
*.pid = svn:mime-type=application/octet-stream
*.pid-lock = svn:mime-type=application/octet-stream
*.pl = svn:mime-type=application/octet-stream
*.pm = svn:mime-type=application/octet-stream
*.pm_handler = svn:mime-type=application/octet-stream
*.png = svn:mime-type=application/octet-stream
*.pod = svn:mime-type=application/octet-stream
*.prefs = svn:mime-type=application/octet-stream
*.pro = svn:mime-type=application/octet-stream
*.project = svn:mime-type=application/octet-stream
*.properties = svn:mime-type=application/octet-stream
*.proxy = svn:mime-type=application/octet-stream
*.psd = svn:mime-type=application/octet-stream
*.pub = svn:mime-type=application/octet-stream
*.pyc = svn:mime-type=application/octet-stream
*.python-eggs = svn:mime-type=application/octet-stream
*.r175 = svn:mime-type=application/octet-stream
*.r296 = svn:mime-type=application/octet-stream
*.rdpgated = svn:mime-type=application/octet-stream
*.readme = svn:mime-type=application/octet-stream
*.realpath = svn:mime-type=application/octet-stream
*.restparam = svn:mime-type=application/octet-stream
*.rpcd = svn:mime-type=application/octet-stream
*.s = svn:mime-type=application/octet-stream
*.sbin = svn:mime-type=application/octet-stream
*.scss = svn:mime-type=application/octet-stream
*.sct = svn:mime-type=application/octet-stream
*.server = svn:mime-type=application/octet-stream
*.setup_db = svn:mime-type=application/octet-stream
*.so = svn:mime-type=application/octet-stream
*.srl = svn:mime-type=application/octet-stream
*.stl = svn:mime-type=application/octet-stream
*.stp = svn:mime-type=application/octet-stream
*.svg = svn:mime-type=application/octet-stream
*.swf = svn:mime-type=application/octet-stream
*.swo = svn:mime-type=application/octet-stream
*.swp = svn:mime-type=application/octet-stream
*.t = svn:mime-type=application/octet-stream
*.targ = svn:mime-type=application/octet-stream
*.ticket = svn:mime-type=application/octet-stream
*.tm_properties = svn:mime-type=application/octet-stream
*.tmp = svn:mime-type=application/octet-stream
*.tmpl = svn:mime-type=application/octet-stream
*.ts = svn:mime-type=application/octet-stream
*.ttf = svn:mime-type=application/octet-stream
*.txt = svn:mime-type=application/octet-stream
*.union = svn:mime-type=application/octet-stream
*.uniq = svn:mime-type=application/octet-stream
*.utf8 = svn:mime-type=application/octet-stream
*.wav = svn:mime-type=application/octet-stream
*.without = svn:mime-type=application/octet-stream
*.woff = svn:mime-type=application/octet-stream
*.woff2 = svn:mime-type=application/octet-stream
*.words = svn:mime-type=application/octet-stream
*.xclangspec = svn:mime-type=application/octet-stream
*.xls = svn:mime-type=application/octet-stream
*.xlsx = svn:mime-type=application/octet-stream
*.z = svn:mime-type=application/octet-stream
*.zip = svn:mime-type=application/octet-stream
------------------------------------------------------------
2.환경변수 추가
SETX SVN_EDITOR "%windir%\System32\notepad.exe"
3.접속 테스트
svn list --username svn --password svn "svn://10.10.10.111/sample_repo"
svn list --username svn --password svn --non-interactive --trust-server-cert "https://10.10.10.111:443/svn/sample_repo"
※질문이 나오면 p를 눌러 영구저장 처리
4.import
아무것도 들어있지 않은 원격 저장소에 처음으로 파일을 업로드 할 때 한번만 사용
svn import --username svn --password svn --non-interactive --force --no-auto-props --no-ignore -m "Import Test 1" D:\0_tmp "svn://10.10.10.111/sample_repo"
5.checkout
svn checkout --username svn --password svn --non-interactive --force "svn://10.10.10.111/sample_repo" "D:\0_tmp"