昨日書いたgitの空ブランチ等についてのまとめ に関連してローカルで新たにレポジトリやブランチを作って、 それでリモートにあるリポジトリ、ブランチを強制的に上書きする方法について。 Gitの思想に反するような話ですが、例えばgh-pagesみたいに GitHubを単に表に見せるための中継点として使うような場合に使います。 使ってるgitのバージョンは1.8.4です。
ローカルでレポジトリを作る
$ mkdir local_repo;cd local_repo
$ git init
Initialized empty Git repository in .../local_repo/.git/
$ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = false
$
リモートレポジトリを追加
GitHubにmaster
、aaa
ブランチを持つtest
という
レポジトリがあるとします。
$ git remote add origin [email protected]:rcmdnk/test.git
$ git branch -a
この時点ではbranchは何も見えません。
.git/config
にはremote "origin"
が追加されてます。
$ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = false
[remote "origin"]
url = [email protected]:rcmdnk/test.git
fetch = +refs/heads/*:refs/remotes/origin/*
$
空の状態でコミット
git init
した直後は何も変更が無いのでそのままだと
コミットすら出来ませんが、
--allow-empty
を与えると何も変更がない状態でも
新たにコミットすることが出来ます。
$ git commit --allow-empty -m "empty commit"
[master (root-commit) xxxxxxx] empty commit
$ git branch -a
* master
リモートにプッシュ
通常の作業では
git pull origin master
等してローカルとリモートをマージしてからプッシュしますが、
今回はローカルの状態でリモートを上書きするため、
直接-f
を使って強制的にプッシュします。
$ git push -f
Counting objects: 2, done.
Writing objects: 100% (2/2), 157 bytes | 0 bytes/s, done.
Total 2 (delta 0), reused 0 (delta 0)
To [email protected]:rcmdnk/test.git
+ xxxxxxx...yyyyyyy master -> master (forced update)
これで、リモートレポジトリのmaster
ブランチは
ローカルの空の状態で初期化されて過去の履歴も消えます。
この後でブランチを見てみると、
$ git br -a
* master
remotes/origin/master
$
この状態でも.git/config
は上のoriginの情報まで。
この状態でpush
するとorigin
をリモートとして
自動的に
$ git push -f origin master
と同じことをしてくれるみたいです。
古いgitだと?この辺をきちんと示しておかないといけない?ので、
$ git push -u origin master
または
$ git push --set-upsteream origin master
として、.git/config
へ
[branch "master"]
remote = origin
merge = refs/heads/master
を加えます。これは
$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master
とするのと同じことです 1。
レポジトリの名前を変えたり色々変更するときには この辺の設定が必要です。
-
ローカルで作ったリポジトリをgithubに初めてpushする方法