[github] Public repo를 private으로 바꾸기

public project를 가져와서 혼자 몰래 뭘 해보고 싶을 때, Apache 2.0 License 등 derived works의 source code 공개 의무가 없는 프로젝트의 경우 private으로 바꿔서 작업을 해볼 수 있다.

다음과 같이 한다.

먼저 만들고 싶은 이름으로 github에서 project를 하나 private으로 만든다.

$ git clone --bare https://github.com/publicproject/project.git
$ cd project.git
$ git push --mirror https://github.com/myname/myproject.git

그리고 나서 실제로 clone해서 쓰면 된다.

$ git push https://github.com/myname/myproject.git

최신 코드로의 업데이트는 public repository를 여기다 remote로 추가해서 fetch & rebase하면 된다.

push는 public으로 fork해온 후 거기다 push 해서 pull request하면 될 듯.

참고: https://medium.com/@bilalbayasut/github-how-to-make-a-fork-of-public-repository-private-6ee8cacaf9d3

gerrit 프로젝트 Mirroring 하기

gerrit을 사용하면 자기가 access 권한이 있는 프로젝트의 리스트를 ssh를 이용하여 ls-projects 라는 명령을 이용해서 얻어올 수 있다. http://gerrit-documentation.googlecode.com/svn/Documentation/2.2.0/cmd-ls-projects.html 를 참고하면 되는데, 해당 도움말을 보면 이 명령을 이용해서 접근 가능한 모든 Project 를 clone 할 수 있는 쉘 스크립트가 있다.

for p in `ssh -p 29418 review.example.com gerrit ls-projects`
do
  mkdir -p `dirname "$p"`
  git clone --bare "ssh://review.example.com:29418/$p.git" "$p.git" 

done 

이것과 crontab, shell script를 조금 응용하면 계속적으로 업데이트 함으로써 Mirroring 을 할 수 있다.

#!/bin/sh
PLATFORM_HOME=`readlink -e .`
PROJECT_LIST=`ssh -p 29418 review.example.com gerrit ls-projects`
ROOT=”ssh://review.example.com”
DIRNAME=”/usr/bin/dirname”
BASENAME=”/usr/bin/basename”
for PROJECT in $PROJECT_LIST
do
        cd $PLATFORM_HOME;
        echo “——————————————————–“
        echo ” $PROJECT.git”
        if [ -d $PROJECT.git ]; then
                echo “Entering $PROJECT.git”;
                cd $PROJECT.git;
                git remote update
        else
                echo “Cloning $ROOT/$PROJECT.git”;
                PROJECT_DIR=`$DIRNAME $PROJECT`
                mkdir -p $PROJECT_DIR
                git clone –mirror “$ROOT/$PROJECT.git” “$PROJECT.git”
        fi
done

 미러링 사용시에는 받아오기 전에 다음 명령과 같이 설정하여 사용하면 된다.

 git config –global url.”git://<IP>”.insteadOf “git://codeaurora.org”