2016-09-23 4 views
-3

私の無知をここで許してください...ここに背景があります:テストスクリプトを整理するためのTestScritpsディレクトリを作成しました。私は<root dir>から<root dir>/TestScriptsに3つのスクリプトを移動しました。私は一度に1つずつ移動し、それぞれの後にローカルコミットを実行しました。私はすべての変更をプッシュしました。なぜ 'git mv'はファイルを移動しないのですか?どのように "正常に"行動するようにするには?

私は別のマシンに行き、プル行わ:ファイルがコピーされただけ

$ cd cryptopp/ 
$ git pull 
remote: Counting objects: 25, done. 
remote: Compressing objects: 100% (24/24), done. 
remote: Total 25 (delta 11), reused 0 (delta 0), pack-reused 0 
Unpacking objects: 100% (25/25), done. 
From https://github.com/weidai11/cryptopp 
    2ac9ea1..2a22a84 master  -> origin/master 
Updating 2ac9ea1..2a22a84 
Fast-forward 
TestScripts/cryptest-android.sh | 44 + 
TestScripts/cryptest-ios.sh  | 40 + 
TestScripts/cryptest.sh   | 5729 +++++++++++++++++++++++++++++++++++++++ 
rijndael.cpp     | 2 +- 
setenv-android.sh    | 85 +- 
5 files changed, 5870 insertions(+), 30 deletions(-) 
create mode 100755 TestScripts/cryptest-android.sh 
create mode 100755 TestScripts/cryptest-ios.sh 
create mode 100755 TestScripts/cryptest.sh 

$ ls *.sh 
cryptest-android.sh cryptest.sh  setenv-android.sh setenv-ios.sh 
cryptest-ios.sh  rdrand-nasm.sh setenv-embedded.sh 

お知らせ。彼らは動かされなかった。

git-mv man pageを確認しましたが、誤った動作は説明されていません。

私には2つの質問があります。 git mvはファイルをコピーするだけで、移動しないのはなぜですか? git mvを "正常に"実行させるにはどうすればよいですか?ここで、「通常」とは、コマンドラインを使用したほぼすべての人が、ファイルを<target location>から<destination location>に移動することを意味します。


ここに関連するコマンド履歴があります。

994 rm -rf cryptopp/ 
    995 git clone https://github.com/weidai11/cryptopp 
    996 cd cryptopp/ 
    997 mkdir TestScripts 
    998 git mv cryptest.sh TestScripts/ 
    999 ls *.sh 
1000 git commit TestScripts/cryptest.sh -m "Organize test scripts (Issue 303)" 
1001 ls *.sh 
1002 git mv cryptest-ios.sh TestScripts/ 
1003 git commit TestScripts/cryptest-ios.sh -m "Organize test scripts (Issue 303)" 
1004 ls *.sh 
1005 git commit 
+1

'git status'から何を得ますか? – Amit

+0

元のマシンで実行したコマンドの正確なシーケンスは何でしたか? –

+0

@Amit - 移動を行ったマシン:*** 'あなたの支店は 'origin/master'で最新です。 '***しかし、私はクローンを削除して再クローンしました。私はGitがインデックスファイルを壊さないようにするために必要なことを見つけました。それが起こると、私はブランチを切り替えることさえできないので、私はすべての費用をかけずに避けようとしている状態です。コピーと動きは定期的にGitを破るように見えるので、私は操作後にそれを行います。 – jww

答えて

3

git pullの出力に示されている要約から、これらのファイルは削除されていないことがわかります。

あなたが例えばをした:

git commit TestScripts/cryptest.sh -m "Organize test scripts (Issue 303)" 

をGitが内部で移動が一つのファイルを削除して新しい同じものを作るとして記録され、ファイルの移動を追跡について通常は良いですが。 新しいファイルではなく、が元の場所からファイルを削除しているため、ファイルをコピーしたばかりのように見えます。将来的には

、それはcommitコマンドからファイル名を除外するために、一般的には良い考えです:

git commit -m "Organize test scripts (Issue 303)" 

あなたがコミットされるかを確認するgit status事前に行い、必要に応じて変更することができます。

フルセッションは、次のようになります

$ git mv cryptest.sh TestScripts/ 
$ git status 
On branch master 
Changes to be committed: 
    (use "git reset HEAD <file>..." to unstage) 

     renamed: cryptest.sh -> TestScripts/cryptest.sh 

$ git commit -m "Organize test scripts (Issue 303)" 
$ git status 
On branch master 
nothing to commit, working directory clean 
$ ls cryptest.sh 
ls: cannot access cryptest.sh: No such file or directory 
$ ls TestScripts/cryptest.sh 
TestScripts/cryptest.sh 

、修正を行うために:

git rm cryptes*.sh 
git commit 

あなたの代わりにあなたの歴史を修正したい場合は、あなたが行うことができます:

git rebase -i HEAD^3 

関連するコマンドのコマンドを変更するそのからeditまでです。各停止時に:

git rm <file> 
git commit --amend 
git rebase --continue 

ここで、<file>は現在の元のファイルです。

これは履歴を書き換えるため、マシン間を移動するときに問題が発生する可能性があることに注意してください。あなたが将来的にトラブルに実行するので、もし、Gitのレポを削除して再クローンする必要がないことを


注意、それは根本的な問題を解決しようとする方が良いでしょう。

+0

Scottに感謝します。 Gitを期待どおりに動作させるにはどうすればよいですか?私は、 'git mv'が実際に、自由な世界のほぼすべての人がファイルを移動するときに期待することをしたいと思います。 – jww

+0

@jww私の答えを更新しました。 –

+0

Scottさん、ありがとうございます。私は私が断ることに苦しんでいると思う(私の無知のため、私の謝罪)。私は歴史や何かを書き直す必要はありません。想像してやることをしようとすると、私の人生は複雑になり、私の主な仕事から離れます。それが私が削除してやり直す理由です。将来の参考として、 'git mv ...を実行すると、 git commit ...; git push'では、コピーはできませんが、移動が確実に行われるようにしますか?最高の私はGitだけコピーを言うことができます。それは動かない。実際にファイルを移動する*「実際の」*移動コマンドがありますか? – jww

2

git commitコマンドの使用中に問題が発生しました。

git mvファイルを必要に応じて移動します。言ってやるが、私はaと呼ばれる単一のファイル、とのレポを持っている、と私はbとしてそれを移動したい:

$ git mv a b 
$ git status 
On branch master 
Changes to be committed: 
    (use "git reset HEAD <file>..." to unstage) 

    renamed: a -> b 

$ ls 
b <-- Only b exists here, no a 

動きは今のインデックスに記録しますが、コミットされていません。コミットを作成するには、私が行います

$ git commit -m "Move a as b" 

しかし、何をやったことだった:あなたはgit commitの引数としてファイル名を与えるとき

$ git commit b -m "Move a as b" 
[master b275677] Move a as b 
1 file changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 b 

はそれだけではなく、コミットに記載されているファイルが含まれています現在のインデックスを記録します。

内部的に、gitは動きが何であるか理解していません。ファイルが作成され、別のファイルが削除されたことを認識します。履歴を表示するために使用されるツール(たとえばgit log)は、これらの2つの情報を組み合わせて、移動したファイルを表示します。しかし、新しく作成したファイルのみをコミットに含めるように指定した場合、古いファイルの削除は記録されないため、他のマシンから引っ張ったときには移動として表示されません。

あなたの質問に対する答え:「なぜgit mvはファイルを移動しないのですか?それを「通常」動作させる方法は? - ファイルを移動しますが、は、新しいファイルの作成だけをコミットするようgitに指示しました。古いファイルの削除ではありません。正常に動作させるには、そのようにしないでください。代わりに、ファイル名なしでgit commitを引数として発行してください。

+0

ありがとうございます。 * "あなたは特に、gitに新しいファイルの作成のみをコミットするように指示しました" * - 実際、私はGitにファイルを移動するように指示しました。追加または削除しないでください。背後にあるのはその事業です。移動後、ファイルシステムには1つのファイルしかありません( 'ls'コマンドを再実行します)。それが私がコミットするものです。 Gitが両方のファイルをファイルシステムに残しておけば、gitは両方で何かをするように指示します。 Gitに正常に動作させる方法はありますか? – jww

+1

はい、あなたはgitにファイルを移動するように指示しました。しかし、その後、あなたは全体の動きをコミットしないように言ったが、新しいファイルの作成のみをコミットする。それを「正常に行動する」ようにするには、そうしないでください。 – 1615903

関連する問題