私のGitリポジトリが間違ったルートディレクトリにあります。移動できますか?(../ の代わりに 。/)


118

どういうわけか、1 git initか月ほど前に最新のプロジェクトを編集したとき、プロジェクトのルートより1つ上のディレクトリでコマンドを実行しました。

だから私のリポジトリは./projectディレクトリではなく./project/my-new-projectディレクトリにあります。この問題を以前に気付かなかった方法はわかりませんが、今まで.gitディレクトリを探すことはありませんでした。

プロジェクトを終了せずに、リポジトリを適切なディレクトリに移動して、プロジェクトの新しいベースをgitに伝える方法はありますか?ディレクトリを移動するだけでは機能しません。Gitはすべてのファイルが削除されたと考えています。

回答:


19

保存する履歴をすでに作成していない限り、おそらく最も簡単なことは、.gitサブディレクトリを削除して正しいディレクトリでinitをやり直すことでしょう。

gitを使用して問題を解決した場合、どの解決策でも、実際には変更されない多くの「このファイルをここに移動」の履歴エントリが残ることになりますが、作成時にねじ込みを修正します。正しく作成することをお勧めします。


2
私はあなたの言っていることを理解していますが、これを修正するために実行するin-gitアクションは、実際には変更されていない「ここにこのファイルをここに移動」の履歴を残しますが、作成時にねじ込みを修正します。正しく作成することをお勧めします。
TED

8
これは多くのものを壊します。stackoverflow.com/a/3247756/825364の方がはるかに優れています。
Steve Tauber

2
まあ、いくつかの履歴を保存することは、Gitが使用される目的です。たぶん、私たちは.gitサブディレクトリを削除して、システムからGitをアンインストールする必要がありますか?vcsの代わりにftp-serverを使用することは、おそらく最も簡単なことです。
ガーマン、2015

2
以下の答えはすべての履歴を保持するため、はるかに優れたアプローチです
BigMikeW 2017

2
だから、私はこれをやって、すぐに私の間違いに気づきました。変更を心配することなく、これは白紙の状態に戻す最も簡単な方法です。
Mike

261

私は反対の問題を抱えていました-gitルートを親ディレクトリに移動する必要がありました(project / srcからprojectへ)。

src$ mv .git ../ 
src$ cd ..
project$ git add src
project$ git commit -a

gitはすべての新しいファイルが古いファイルの名前が変更されたバージョンであり、履歴が失われていないことを巧妙に検出しました

同様のことを試すことができます...コミットする前に.gitフォルダを移動してファイルを再度追加してください


8
これは完璧に機能しました。他の.git *構成ファイルも.gitigoreのようなディレクトリから移動しました
Relequestual

7
親愛なる先生、あなたは命の救世主です。このことは本当にうまくいきます。ありがとうございました。
Radu Murzea 2013

1
さらに、私git rm'dは古い場所のファイルを使用しているため、git status(正しく)いくつかの名前変更操作が報告されていました。gitを使って作業すればするほど、好きになります。
ssc 2014年

7
@マイクこれは受け入れられた回答としてマークする必要があります。履歴を失わないため、再初期化の推奨ソリューションです。あなたが私を信じていないなら、賛成票の数がそれ自体を物語っています。
Joseph Spens

3
ありがとうございました!それは私にとってはうまくいきましたが、私はさらにいくつかのことをしなければなりませんでした:1.コミットする前に、ルートフォルダーを更新.gitignoreして実行しgit add -Aました。この後、gitはすべてのファイルをrenamedではなくとして正しく表示しましたdeleted。2.サブモジュールを使用している.gitmodulesため、新しいルートに移動して、さまざまなgit構成ファイルのサブモジュールパスを更新する必要がありました。変更するファイルを見つけるために実行しましたgrep -nrI --color 'old/path/to/submodule' .
Guido Walter Pettinari 2017年

43

これは私にとってはうまくいき、すべての私の歴史をそのまま維持しました。不適切なルートフォルダー(誤ってリポジトリを初期化した親)から:

フォルダを移動します。

mv .git thecorrectfolder/

git repoを再初期化します。

cd thecorrectfolder/
git init

すべてのファイルを再度追加し、コミットしてプッシュします。

git add .
git commit -am 'fixing things'
git push origin master

できた!ビールを飲みましょう。

再初期化後にgit repoをコミットすると、次のような出力が得られます。

rename {ethanode/coffee => coffee}/app.coffee (100%)

つまり、親フォルダーからのすべての参照と、正しいフォルダーを使用するように名前が変更されます。


ありがとう!この方法はまさに私が必要としたものでした!
Giel Berkers、2014年

これは私にとってはうまくいきましたが、少し醜いものでした。gitに関する限り、私は何も「移動」せず、数百のファイルを削除してから、何百もの同じファイルを追加しました。
bjmc 2014年

6
git initは必要ありません。残りの部分は、何年も前に提出された私の回答と同じです。stackoverflow.com
a

35

git filter-branchその方法で履歴を書き換えることができます。git filter-branchmanページにはも、あなたのケースを持っている例として

リポジトリを書き直して、foodir /がプロジェクトルートであるかのように見せ、他のすべての履歴を破棄します。

git filter-branch --subdirectory-filter foodir -- --all

実行git clone前(またはgit filter-branch実行後)に新しいサブディレクトリにリポジトリを置きたいと思うでしょう。(フィルターブランチの前にクローンを作成し、新しいクローンでフィルターブランチを実行すると、.git/問題が発生した場合のバックアップとして元のディレクトリをそのまま残しておくことができます。)


1
これは「他のすべての履歴を破棄」しません(.gitサブディレクトリが「ルートとして考えられる」間、リポジトリがトップレベルに留まることを示唆します)-これは文字通り、リポジトリ内の他のすべてのファイルを破棄し、すべてのファイルをsubdirectory/*ルートフォルダに移動します。
Louis Maddox

すばらしい回答ですが、.gitignoreファイル(追跡されている場合)がある場合、この操作で失われることに注意してください。また、git push --forceこの後、アップストリームリポジトリを更新するためにaを実行する必要があります。
危険な16

12

Gitはハッシュを使用してファイルを記憶できます。

.gitルートディレクトリに移動し、オプションでgitすべてのファイルの変更を記憶するように指示するだけ--allです。

$ mv .git ../
$ cd ..
$ git add . --all 
$ git status // => you can see all the files recognized as renamed 100%
$ git commit -m "Moves repo to root directory."

3

使用しgit-mv、適切な場所に「UP」その後、あなたのファイルを移動するためにgit-rm、「私の新しいプロジェクト」ディレクトリを。


それは逆です。すべてのファイルをgitが存在するディレクトリに移動したくない(他にもたくさんのものがそこにある...煩わしいでしょう)gitを上に移動します。リポジトリをプロジェクトのルートディレクトリに移動したい。
マイク、

2

リポジトリをどこかに移動する方法を探してここに来ました。

念のため、私だけではなかったので、最後に次のようにしました。

https://git.wiki.kernel.org/index.php/GitFaq#How_do_I_clone_a_repository_with_all_remotely_tracked_branches.3F 私はリポジトリの「git clone --mirror」ダベアコピーをコピーし、その後、もう裸にしないように指示したので、ファイルが表示されましたその新しいフォルダに。(次に、ファイルとログが表示されたかどうかを確認しました。)念のために、古いリポジトリをしばらく保持しました...

これにより、履歴を失うことなくリポジトリを移動できました。

最高の挨拶、ダイナ


私が間違っている場合は修正してくださいmv /path/to/the/old/location/of/the/repo /path/to/the/new/location/of/the/repo。しかし、のような裸のファイルシステムツールのみを使用して、リポジトリディレクトリを指定された位置に移動するだけでそれを達成できたようです。
キューディー

2

この同じ問題を経験したばかりの私の最終的な解決策は:

  1. .gitフォルダーを必要な場所に移動します。
  2. .gitを移動したフォルダーにディレクトリを変更します。
  3. フォルダーの内容をgitが想定している内容にリセットします。 git reset --hard HEAD
  4. 内容がkdiff3または別の比較ツールで本来あるべきものと一致することを確認します
  5. 元の場所にあるバージョン管理されていないファイルを削除します。

歴史に影響を与えることなく、魔法のように機能しました。- 注意:いくつかの変更を行った場合は、必ず.gitディレクトリを移動する前にそれらをコミットしてください。


-3

ここには2つの方法があります。

  1. cd TheWrongDirectory rm -rf .git

  2. .gitフォルダを削除して、正しいディレクトリに移動します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.