Gitで追跡されていないファイルを削除する方法


110

私はブランチに取り組んでいます。つまり、自分のマスターブランチからブランチした「実験的」ブランチと言います。次に、実験的ブランチでユーザーモデルを生成しますが、まだインデックスに追加していません。

最近実験ブランチに追加されたファイルのすべての変更を破棄したい場合はどうすればよいですか?追跡されていないファイルは次のとおりです。

$ git status
 On branch new_chick
 Untracked files:
   (use "git add <file>..." to include in what will be committed)

       .project
       app/models/user.rb
       db/migrate/
       test/fixtures/users.yml
       test/unit/user_test.rb

これらの変更をすべて取り消すために「git reset --hard」を実行しようとしましたが、上記のすべてのファイルはまだ表示されています。

誰か私に光を当ててください


回答:


220

追跡されていないファイル/ディレクトリを削除するには、次のようにします。

git clean -fdx

-f-力

-d-ディレクトリも

-x-無視されたファイルも削除します(無視されたファイルを削除したくない場合は使用しないでください)


54
誤ってアイテムを削除しないように、最初にプレビューに-nを追加
Druska

8
これは素晴らしい!ただし、意図的に.gitignoreで無視されていても、ローカルの開発環境に必要な構成ファイルは削除されます。同じコマンドを対話モード用の追加の-iと一緒に使用できます:git clean -fdxiとすると、削除するファイルを入力するように求められます。
moeabdol

5
これはすばらしいことですが、-xファイルを完全に削除するため、ユーザーに注意して使用するように通知を追加することをお勧めします。または-n、@ Druskaで言及されているように使用
lacostenycoder

3
-xまだ使用していませんでした。プロジェクトと他の構成ファイルは削除されました。最後のコミットから新しいディレクトリに再度リポジトリをプルする必要がありました。
タイムキーパー2016

2
このコマンドは必要なファイルを削除する可能性があるため、潜在的に危険であることを通知する必要があると思います!!!
Davide 2017年

20

ユーザーインタラクティブなアプローチ:

git clean -i -fd

Remove .classpath [y/N]? N
Remove .gitignore [y/N]? N
Remove .project [y/N]? N
Remove .settings/ [y/N]? N
Remove src/com/amazon/arsdumpgenerator/inspector/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/s3/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/s3/ [y/N]? y

-i(インタラクティブ)
-f(強制)
-d(ディレクトリ)
-x(無視されたファイル)(必要に応じて追加

注: -nまたは--dry-run追加して、機能を確認します。


17

それらは追跡されていないファイルです。つまり、gitはそれらを追跡していません。それらはgit ignoreファイルにないので、それらをリストしているだけです。それらはgitによって追跡されていないので、git reset触れないでください。

追跡されていないすべてのファイルを吹き飛ばしたい場合は、最も簡単な方法ですgit clean -fgit clean -n実際には何も削除せずに何が破壊されるかを確認したい場合に使用します)。それ以外の場合は、不要なファイルを手動で削除できます。


5

追跡されていないファイルを削除する場合:

git clean -f

追跡されていないディレクトリも削除するには、次を使用します。

git clean -f -d

心停止を防ぐには、

git clean -n -f -d


どれでも「心停止」😂😂😂
リシKulshreshtha

2

別の方法でローカルリポジトリの以前の状態に戻ることもできます。

  1. を使用して、追跡されていないファイルをステージング領域に追加しますgit add
  2. でローカルリポジトリの前の状態に戻りgit reset --hardます。


0

まあ、私は同様の問題がありました。私は最新のものを撮っていましたが、ローカルでいくつかの変更があったため、特定のファイルに対してマージが行われていませんでした。ファイルは追跡されておらず、私はそれらを望まなかったので、私がしたことは-

$ git checkout filepath / filename

filepath-git bashを実行した場所。それから私が最新のものを取ったとき、変更は利用可能でした


0

一方でgit clean作品がうまく、私はまだそれが便利なgitのレポをきれいにする私自身のスクリプトを使用して見つけ、それはいくつかの利点があります。

これにより、クリーンアップするファイルのリストが表示され、インタラクティブにクリーンアップするかどうかを確認するプロンプトが表示されます。ファイルごとに対話的にプロンプ​​トを表示するのは面倒なので、ほとんどの場合これが必要です。

また、リストを手動でフィルタリングすることもできます。これは、クリーンアップしたくない(コミットしない理由がある)ファイルタイプがある場合に便利です。


git_clean.sh


#!/bin/bash
readarray -t -d '' FILES < <(
    git ls-files -z --other --directory |
        grep --null-data --null -v '.bin$\|Cargo.lock$'
)
if [ "$FILES" = "" ]; then
    echo  "Nothing to clean!"
    exit 0
fi

echo "Dirty files:"
printf '  %s\n' "${FILES[@]}"

DO_REMOVE=0
while true; do
    echo ""
    read -p "Remove ${#FILES[@]} files? [y/n]: " choice
    case "$choice" in
        y|Y )
            DO_REMOVE=1
            break ;;
        n|N )
            echo "Exiting!"
            break ;;
        * ) echo "Invalid input, expected [Y/y/N/n]"
            continue ;;
    esac
done

if [ "$DO_REMOVE" -eq 1 ];then
    echo "Removing!"
    for f in "${FILES[@]}"; do
       rm -rfv "$f"
    done
fi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.