rcmdnk's blog

Overwrite (The 01:23 Bardo, Book 2 of 6)

昨日書いた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にmasteraaaブランチを持つ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

レポジトリの名前を変えたり色々変更するときには この辺の設定が必要です。

Sponsored Links
Sponsored Links

« gitのブランチについてのまとめ You don't exist, go away! »

}