2

git status名前が変更されたファイルのパッチを対話的に追加した後、出力に予期しない「dev/null」が表示されます。これは予期されたものであり、この動作には正当な理由があるのか​​、それともバグである可能性があるのか​​ 疑問に思っています。

以下は、これを再現する方法の簡単な図です。私の実際のシナリオでは、もう少し複雑で、 を使用しているのには十分な理由がありますが、次のgit add -p最小限の例に要約することができました。

$ git 初期化テスト
/local_disk/tmp/test/.git/ で初期化された空の Git リポジトリ
$ cd テスト
$ echo "foo" > foo
$ git add foo
$ git commit -m 'Add foo'
[マスター (ルートコミット) 3643b5d] foo を追加
 1 ファイル変更、1 挿入 (+)、0 削除 (-)
 作成モード 100644 foo
$ mv foo バー
$ git add -p
diff --git a/foo b/foo
インデックス 257cc56..0000000
--- a/foo
+++ /dev/null
@@ -1 +0,0 @@
-ふー
このハンクをステージング [y,n,q,a,d,/,e,?]? y

$ git ステータス
# ブランチ マスター上
# コミットする変更:
# (「git reset HEAD ...」を使用してステージングを解除します)
#
# 新しいファイル: dev/null
# 削除: foo
#
# 変更されたが更新されていない:
# (「git add/rm ...」を使用して、コミットされる内容を更新します)
# (「git checkout -- ...」を使用して、作業ディレクトリの変更を破棄します)
#
# 削除: dev/null
#
# 追跡されていないファイル:
# (「git add ...」を使用して、コミットされる内容を含めます)
#
# バー

「新しいファイル: dev/null」と「削除されたファイル: dev/null」とは何ですか? これは、私が行った場合とまったく同じ結果になると予想されます。

$ mv foo バー
$ git rm foo
$ git ステータス
# ブランチ マスター上
# コミットする変更:
# (「git reset HEAD ...」を使用してステージングを解除します)
#
# 削除: foo
#
# 追跡されていないファイル:
# (「git add ...」を使用して、コミットされる内容を含めます)
#
# バー

私は Git バージョン 1.6.5.5 を使用しており、1.6.5.4 でも再現しています。バージョン 1.6.1.2 の Git がある Cygwin 環境では再現できませんでした。

4

1 に答える 1

2

git addthenduks が言及しているように、ファイルを削除 しようとするべきではありません。git add新しいファイル、git rm古いファイル (またはgit mv old new単純なアプローチを取る)。一方、git は、ユーザーが行っていることについて不平を言うか、混乱してはならず、存在しない dev/null ファイルを追加しようとする必要があります。

更新
git add -pは確かにファイルの削除をステージングするための有効な方法ですが、別のバグgit applyを修正するときにバグが導入されたようです。git apply

更新
1.6.1.2 の Linux で再現できたので、通常の動作と異なるのは cygwin git である可能性があります。その場合、前述のバグ修正がこの動作を導入していない可能性があり、動作git add -pは cygwin の git に固有のものである可能性があります。私はgit add -p失敗し始めた場所を見つけるために二等分しようとしていました。

アップデートこれは、 Jeff King がパッチ
を提案 したインタラクティブな側面のバグであることが判明しました。git add

于 2009-12-07T19:04:17.767 に答える