既存のディレクトリ(フォルダ)にgit cloneして上書きしたい

git_cloneSubversionのリポジトリをGitLabに移行後、今まで開発していたフォルダでgit cloneしてみるとエラー。

fatal: destination path 'api' already exists and is not an empty directory.

環境: CentOS 6.6, git 1.7.1

 

一旦フォルダごと削除して、git cloneし直せばいいのだけれど、権限の設定や本番環境でも削除してgit cloneはやりたくない。

gitの仕組みを理解すれば簡単なことだった。

腑に落ちるまで時間がかかった。

 


<2015/07/06 Modified>
実機コンソールでコマンド実行すること。Windowsから共有ファイル経由で実行すると時間が掛かり過ぎる(失敗する)。

本番環境でブランチとマージしたときに実行したコマンド
# cd /path/to/project/
# git init
# git remote add origin git@gitlab.hoge.jp:suganuma/project-wordpress.git
# git fetch origin
# git checkout -b branch-name
# git checkout origin/branch-name -- .gitignore
# git add --all
# git add -f wp-config.php
# git merge origin/branch-name

エラーになったらブランチ上のファイルで上書き。移行した直後ならこれをやらなくてもいいはず。
# git checkout origin/branch-name -- /path/to/file

# git merge origin/branch-name

svnとお別れする
# rm -rf .svn/


< 2016/03/31 追加 >
上のやり方でマージできなかったので「theirs」を使った方法

途中までは一緒
# cd /path/to/project/
# git init
# git remote add origin git@gitlab.hoge.jp:suganuma/project-wordpress.git
# git fetch origin
# git checkout -b branch-name
# git checkout origin/branch-name -- .gitignore

何かあった時でも戻せるように一度コミット
# git add --all
# git commit -m 'Before convert to git'

リポジトリを優先で更新。最後の「.」(ドット)がポイント
# git checkout --theirs origin/branch-name .

コミット
# git commit -m 'Merge with branch-name'

git pullできるようにしておく
# git branch --set-upstream-to=origin/branch-name branch-name

確認
# git pull

コミットを一つにまとめる
# git rebase -i

やっぱりフォルダを削除してgit cloneした方が早い。権限の設定が必要なら別ファイルにまとめておく。


 

まずは開発ディレクトリをgitローカルリポジトリにする
# cd /path/to/project/
# git init

「origin」という名前でリモートリポジトリを追加
# git remote add origin git@gitlab.hoge.jp:suganuma/project-api.git

ローカルリポジトリを最新にする
# git fetch origin

確認
# git branch -a

「origin/master」とマージする
# git merge origin/master

確認
# git branch -a

ローカルリポジトリが「master」ブランチになっているはず。

試しにファイルを追加してみる
# vi test.txt
# git status

# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       .svn/
#       test.txt
nothing added to commit but untracked files present (use "git add" to track)

ファイルをローカルリポジトリに追加
# git add test.txt
# git status

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   test.txt
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       .svn/

なかったことにする
# git reset
# git status

# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       .svn/
#       test.txt
nothing added to commit but untracked files present (use "git add" to track)

git resetに関しては下記記事がわかりやすい。

 


Mac上にあるTitaniumプロジェクトでmergeしようとしたらエラー。

環境: OS X Yosemite 10.10.3, git 2.3.2 (Apple Git-55)

$ git merge origin/master

error: Untracked working tree file 'CHANGELOG.txt' would be overwritten by merge.
fatal: read-tree failed

svnからそのまま変換しただけなので一緒のはず。

まずは.gitignoreを作成
$ vi .gitignore

/.project
/.settings
/.svn
/build
/node_modules

確認
$ git status

追加してマージ
$ git add --all
$ git merge origin/master

確認
$ git status

svnコマンドも使える
$ svn status

.gitignoreをコミット
$ git commit -m 'add files for git'

アカウントを確認してプッシュ
$ git config --list
$ git push origin master

 


< 2015/06/05 Modified >

別プロジェクトで下記エラーになったとき。

$ git add --all
$ git merge origin/master

error: Entry '.gitignore' would be overwritten by merge. Cannot merge.
fatal: read-tree failed

ブランチ作成
# git checkout -b develop

developにコミット
# git commit -m 'add files for merge'

masterに切り替え
# git checkout master

確認
# git status

この状態がmasterと同期している。

developにある「.gitignore」を取ってきて、プッシュ。
# git checkout develop -- .gitignore
# git commit -m 'modified .gitignore'
# git push origin master

無事完了。developブランチは削除してもいいはず。

試しにこの状態でdevelopブランチとマージしてみた。
# git merge --no-ff develop

コンフリクトがいっぱい。。。するんじゃなかった。。。

ファイルは一緒のはず。

たぶんssh経由のCentOS上でgitコマンド叩いたのと共有ファイル経由でWindowsからgitコマンド叩いてたので、ファイルの権限が変わったからだと思う。

svnが残っているのでそっちで差分を確認。git diffでもok。
# svn status

変更(コンフリクト)になっていたのを修正してadd
# git add --all
# git status

すると(内容を)変更したファイルだけになった。一安心。これでプッシュ
# git commit -m 'merge with develop'
# git push origin master

GitLab上は下図のようになった。最後のコメントを「merge with subversion」とすれば分かりやすかったと思う。

image

developブランチは削除
# git branch -d develop

 

< Related Posts >