今回の情報の対象
- 個人or社内開発のリポジトリはOnedriveや社内クラウドなどのクローズド環境に置いている(クローズドリポ)。
- 公開用ソースは、それとは別のリポジトリ(Github等)にしたい(パブリックリポ)。
- パブリックリポでは、公開するファイルを削りたい。
- 開発履歴コメントも、公開用に再整理したい。
ここで、今回の方法では、クローズドリポのコメントはある程度捨ててしまってよい場合や、むしろ捨ててしまって再編集したコメントだけ残したい場合を想定しています。
- コメントも公開用には奇麗で整えたものにしたい。
- 非公開の開発用コメントは、細かく、個人の癖のあるものだ(粒度の小さい)
という状況です。
なんとか目的を達した方法
先に例題のコマンド載せます。私の冗長な文章よむよりもコマンド見た方が早いって人も多いと思うんで。クローズドブランチをmaster
、パブリックブランチをpub
とします。close.txt
が公開したくないファイルで、pub
ブランチからはそれを除きます。
mkdir gittest
cd gittest
#(1)prepare closed branch "master", and do commit 3 times.
git init
echo "bigdata" > .gitignore
git add .gitignore
git commit -a -m "master1"
echo "master close2" > close.txt
git add close.txt
git commit -a -m "master2"
echo "master open3" > open.txt
echo "master close3" > close.txt
git add open.txt
git commit -a -m "master3"
#(2)make public branch "pub"
#git checkout -b pub `git rev-list --reverse HEAD | head -1`
git checkout -b pub (master1のコミットID)
echo "/close.txt" >> .gitignore
echo "/.gitignore merge=ours" >> .gitattribute
git add .
git commit -a -m "1st pub"
#(3)merge by squash and reset to unstage ignored files
git merge --squash -Xtheirs master
#git reset `git ls-files --full-name -i --exclude-standard`
git reset
git add .
git commit -m "pub3"
#(4)advance to develop on closed "master" branch
git checkout master
echo "master open4" > open.txt
echo "master close4" > close.txt
git commit -a -m "master4"
echo "master open5" > open.txt
echo "master close5" > close.txt
git commit -a -m "master5"
#(5) merge to pub same as (3)
git checkout pub
git merge --squash -Xtheirs master
#git reset `git ls-files --full-name -i --exclude-standard`
git reset
git add .
git commit -m "pub5"
ここで、開発が進むたびに(4)から(5)が繰り返されます。
また、(1)の直後に、.git/config
に以下を追加します。これで、.gitignore
がmergeによって書き換わらなくなります。
[merge "ours"]
name = "Keep ours merge"
driver = true
ただし、mergeでは書き換わらないので、クローズドリポの方で.gitignoreに追記した場合には、手動で公開用リポの.gitignore
も書き換えてやる必要があります。
初回以外は毎回手順(3)でマージすることになります。ここで、merge --squash
でマージしますが、これだけだと公開リポでは無視したいclose.txt
もステージングされてしまっています。そこで、一旦git reset
で全てのステージングを取り消し、再度git add .
でステージングします。これによって、.gitignore
で指定したファイルが公開用ブランチで正常に無視されます。この部分はコメントアウトした
git reset `git ls-files --full-name -i --exclude-standard`
でも代用できます。PowerShellではバッククォートによるコマンドが動かないので、今回はこのようにしました。
注意
Windows環境では、PowerShellなら問題ないですが、WSL(Windows10 1903)上で動かすと、ファイル操作が遅いためか時々おかしな動作になります。ファイルが消えていなかったり。消したはずのファイルが残っていたり。よって、上記コマンドの例題のコマンドも途中で失敗することがあります。特にgit checkout
で消したはずのファイルが消えてなかったりしてErrorになります。
別の方法
開発履歴とコメントもできるだけ残したい場合は、前回の記事を参考にどうぞ