@SimonSobisch
mỗi Simons yêu cầu, đây là kịch bản mà tôi đã kết thúc bằng văn bản để di chuyển Subversion vào GH
#!/usr/local/env bash
# Converter for GitHub -> Subversion Repositories
# CPR : Jd Daniel :: Ehime-ken
# MOD : 2013-03-09 @ 16:26:53; 2017-01-31 @ 13:36:15 Simon Sobisch
# VER : Version 1c
# the Github SVN url to clone from
URL={THE_SVN_URL} # https://github.com/user/repo/
# the SVN url to clone to
REPO={THE_REPO_ROOT} in # svn+ssh://[email protected]/api/svn_name
# the SVN structure
SVNTRUNK=${SVN_TRUNK-trunk}
SVNTAGS=${SVN_TAGS-tags}
SVNBRANCHES=${SVN_BRANCHES-branches}
# use the trunk, branch, etc... I'm using the trunk
SVN="${REPO}/$SVNTRUNK"
clear || cls; # set -x #debug
## if you want to burn and rebuild your repo, uncomment below
#
#echo "Burning Repo..."
#svn rm $REPO/{$SVNTRUNK,$SVNTAGS,$SVNBRANCHES} -m "Burning..."
#echo "Rebuilding Repo...."
#svn mkdir $REPO/{$SVNTRUNK,$SVNTAGS,$SVNBRANCHES} -m "Rebuilding..."
# cleanup
find -maxdepth 1 -type d ! -name '.*' |xargs rm -rf; # tmp
# dirs
SVN_FOLDER=`pwd`"/svn"
GIT_FOLDER=`pwd`"/git"
# revs
ENDREV=`svn info $URL |grep Revision: |awk '{print $2}'`
CURREV=1
mkdir -p $SVN_FOLDER $GIT_FOLDER
echo -e "\nLinking SVN repo\n"
cd $SVN_FOLDER
svn co $SVN .
echo -e "\nDownloading GIT repo\n"
cd $GIT_FOLDER
git svn init -s $URL \
-T $SVNTRUNK \
-t $SVNTAGS \
-b $SVNBRANCHES \
--prefix=svn/
# Set authors so we get prettier authors
if [ -f "../authors"]; then
git config svn.authorsfile ../authors
fi
echo -e "\nFound ${ENDREV} revisions\n"
for ((REVISION=$CURREV; REVISION<$ENDREV+1; REVISION++))
do
cd $GIT_FOLDER
echo -e "\n---> FETCHING: ${REVISION}\n"
git svn fetch -r$REVISION; echo -e "\n"
git rebase `git svn find-rev r$REVISION`; echo -e "\n"
# STATUS: git log -p -1 `git svn find-rev r19` --pretty=format: --name-only --diff-filter=A | sort -u
ADD=$(git log -p -1 `git svn find-rev r$REVISION` --pretty=format: --name-only --diff-filter=A |awk '{printf "%s ", $1}')
MOD=$(git log -p -1 `git svn find-rev r$REVISION` --pretty=format: --name-only --diff-filter=M |awk '{printf "%s ", $1}')
DEL=$(git log -p -1 `git svn find-rev r$REVISION` --pretty=format: --name-only --diff-filter=D |awk '{printf "%s ", $1}')
# copy new files
for i in $ADD
do
cp --parents $i $SVN_FOLDER/
done
# copy modified files
for i in $MOD
do
cp --parents $i $SVN_FOLDER/
done
# set opts for SVN logging
HASH=$(git log -1 --pretty=format:'Hash: %h <%H>')
AUTHOR='Jd Daniel <[email protected]>' # or $(git log -1 --pretty="%cn <%cE>")
TMPDATE=$(git log -1 --pretty=%ad --date=iso8601)
DATE=$(date --date "$TMPDATE" -u +"%Y-%m-%dT%H:%M:%S.%N" |sed 's/.....$/Z/g')
LOGMSG=$(git log -1 --pretty=%s)
# move to svn
cd $SVN_FOLDER
# burn file if it exists....
if [ "$DEL" != "" ]; then
for i in $DEL
do
test -f $i && svn --force rm $i
done
fi
# first round of additions....
[ -z "$ADD" ] || svn --force add $ADD
[ -z "$MOD" ] || svn --force add $MOD
# try 2 for adding in case we missed ? files
ADDTRY=$(svn st . |grep "^?" |awk '{print $2}')
[ -z "$ADDTRY" ] || svn --force add $ADDTRY
# do commit
svn ci -m "$LOGMSG"$'\n\n'"$HASH"
# servers pre-revprop-change
# cp hooks/pre-revprop-change.tmpl pre-revprop-change; chmod +x pre-revprop-change
# if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:author" ]; then exit 0; fi
# if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:date" ]; then exit 0; fi
# echo "Changing revision properties other than svn:log, svn:author and svn:date is prohibited" >&2
# change this commits author and date
svn propset --revprop -r HEAD svn:author "$AUTHOR"
svn propset --revprop -r HEAD svn:date "$DATE"
done
exit
Dù sao, git-svn hỗ trợ này thực sự tốt, chỉ với sự thay đổi nhỏ trên bản sao git svn thông thường.
Thay vì tiêu chuẩn dự án/trunk | chi nhánh | thẻ chúng tôi sử dụng hơi khác nhau parent/trunk|branches|tags/project
để bạn sẽ thấy tôi chỉ định cờ - T/-t/-b
.
git svn init
Đây là những gì tôi làm, từ repo git địa phương hiện có:
# Create the project directory in subversion
$ /usr/bin/svn mkdir
https://foo.com/svn/parent/trunk/project
-m "Make project directory."
Committed revision 200.
# Initialize git-svn, doesn't fetch anything yet
$ git svn init https://foo.com/svn/
-T parent/trunk/project
-t parent/tags/project
-b parent/branches/project
--prefix=svn/
# Set authors so we get prettier authors
$ git config svn.authorsfile ../authors
# Now pull down the svn commits
$ git svn fetch
W: Ignoring error from SVN, ...
W: Do not be alarmed at the above message git-svn ...
This may take a while on large repositories
r200 = (guid) (refs/remotes/svn/trunk)
# We should now see our svn trunk setup under our svn remote
$ git branch -av
* master c3a7161 The latest git commit.
remotes/svn/trunk 3b7fed6 Make project directory.
# Now we want to take all of our local commits and
# rebase them on top of the new svn/trunk
$ git rebase svn/trunk
First, rewinding head to replay your work on top of it...
Applying: First git commit
Applying: The latest git commit
# Now we should see our local commits applied
# on top of svn/trunk
$ git lg
* 52b7977 (HEAD, master) The latest git commit
* a34e162 First git commit
* 3b7fed6 (svn/trunk) Make project directory.
# Everything is cool, push it back to svn
$ git svn dcommit
Committing to https://foo.com/svn/parent/trunk/project
...
–prefix=svn
Một lá cờ tôi đặc biệt thích thời gian gần đây, mà bạn cũng có thể sử dụng với git svn clone
, là --prefix=svn/
.
Điều này sẽ tiền tố tất cả các nhánh theo dõi của bạn trong các nhánh, thẻ và thân cây Subversion từ xa với svn /, làm cho nó trông hoàn toàn giống như nguồn gốc/thành ngữ thông thường được sử dụng bởi điều khiển từ xa thông thường.
Với các ngành theo dõi có một tiền tố, bạn cũng có thể sử dụng chúng như tên chi nhánh địa phương, ví dụ:
# Name your copy of svn/trunk "trunk" instead of "master"
$ git checkout -b trunk master
Switched to a new branch 'trunk'
$ git branch -d master
Deleted branch master (was 33c3136).
$ git branch -av
* trunk 33c3136 Latest svn commit
* remotes/svn/trunk 33c3136 Latest svn commit
Sau đó, nếu bạn có các chi nhánh khác mà bạn muốn theo dõi:
$ git checkout -b featurea svn/featurea
đặt cược của tôi là công cụ của bạn không thành công vì github chỉ mô phỏng tập hợp con của giao thức lật đổ (về cơ bản là webdav) được yêu cầu thực hiện kiểm tra và cam kết, trong khi các công cụ bạn đang sử dụng yêu cầu máy chủ lật đổ thực ở đầu bên kia. Bạn đã thử kiểm tra kho lưu trữ bằng cách sử dụng git và sau đó [git-svn] (https://git-scm.com/docs/git-svn) để đẩy toàn bộ lịch sử để lật đổ? – Phillip
Rõ ràng, cách tốt nhất để truy cập vào repo GitHub là sử dụng Git ;-). Một khi bạn có bản sao cục bộ, bạn có thể sử dụng bất kỳ công cụ nào làm việc để bạn có thể quay lại repo SVN và bạn không bị giới hạn bởi mô phỏng SVN của GitHub. –
@Phillip Bạn có thể cung cấp Git [Hub] từng bước cho svn repo làm câu trả lời không? Có vẻ như đây là cách duy nhất có thể đạt được - và do đó sẽ là câu trả lời "đúng" bị thiếu ở đây. –