web-dev-qa-db-ja.com

gitignoreおよび「次の追跡されていない作業ツリーファイルは、チェックアウトによって上書される」

だから私は私の.gitignoreファイルにフォルダを追加しました。

git statusを実行したらそれは私に教え

# On branch latest
nothing to commit (working directory clean)

しかし、ブランチを変更しようとすると、次のようになります。

My-MacBook-Pro:webapp marcamillion$ git checkout develop
error: The following untracked working tree files would be overwritten by checkout:
    public/system/images/9/thumb/red-stripe.jpg
    public/system/images/9/original/red-stripe.jpg
    public/system/images/8/thumb/red-stripe-red.jpg
    public/system/images/8/original/red-stripe-red.jpg
    public/system/images/8/original/00-louis_c.k.-chewed_up-cover-2008.jpg
    public/system/images/7/thumb/red-stripe-dark.jpg
    public/system/images/7/original/red-stripe-dark.jpg
    public/system/images/7/original/DSC07833.JPG
    public/system/images/6/thumb/red-stripe-bw.jpg
    public/system/images/6/original/website-logo.png
    public/system/images/6/original/red-stripe-bw.jpg
    public/system/images/5/thumb/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/5/original/logocompv-colored-squares-100px.png
    public/system/images/5/original/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/4/thumb/DSC_0001.JPG
    public/system/images/4/original/logo.png
    public/system/images/4/original/DSC_0001.JPG
    public/system/images/4/original/2-up.jpg
    public/system/images/3/thumb/logo2.gif
    public/system/images/3/original/logo2.gif
    public/system/images/3/original/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/3/original/11002000962.jpg
    public/system/images/2/thumb/Profile Pic.jpg
    public/system/images/2/original/Profile Pic.jpg
    public/system/images/2/original/02 Login Screen.jpg
    public/system/images/1/original/Argentina-2010-World-Cup.jpg
Please move or remove them before you can switch branches.
Aborting

これが私の.gitignoreファイルのようなものです。

.bundle
.DS_Store
db/*.sqlite3
log/*.log
tmp/**/*
public/system/images/*
public/system/avatars/*

これらのファイルを削除せずにブランチを切り替えることができるようにするにはどうすればこれを機能させることができますか

変更した場合、それらのファイルにも影響がありますか?言い換えれば、後でこのブランチに戻ってきた場合、最新のコミットまではすべて問題ありません。

私はそれらのファイルを失いたくありません、私はただそれらを追跡したくありません。

731
marcamillion

ファイルを無視したいが、それらは既にコミットされているようです。 .gitignoreはすでにリポジトリにあるファイルには影響を与えないので、それらはgit rm --cachedで削除する必要があります。 --cachedは作業コピーに影響を与えないようにし、次回コミットしたときに削除済みとしてマークするだけです。ファイルがリポジトリから削除された後、.gitignoreはそれらが再び追加されるのを防ぎます。

しかし、あなたはあなたの.gitignoreに別の問題を抱えています、あなたは過度にワイルドカードを使用しています、そしてそれはあなたがそれが予想していたよりマッチするのを引き起こします。代わりに.gitignoreを変更して試してみましょう。

.bundle
.DS_Store
db/*.sqlite3
log/*.log
tmp/
public/system/images/
public/system/avatars/
232
Arrowmaster

警告:追跡されていないファイルは削除されるので、提起されている質問に対する良い答えではありません。

私もこのメッセージを打ちました。私の場合は、ファイルを保存したくないので、これは私にとって役に立ちました。

git 2.11以降

git clean  -d  -f .

古いGit

git clean  -d  -f ""

Gitによって無視されたファイルも削除したい場合は、次のコマンドを実行してください。 

警告されます!これはおそらくあなたのプロジェクトを破壊する、あなたが100%知っているならばあなたがしているものだけを使う

git 2.11以降

git clean  -d  -fx .

古いGit

git clean  -d  -fx ""

http://www.kernel.org/pub/software/scm/git/docs/git-clean.html

  • -xは無視されたファイルも削除されることを意味しますgitに未知のファイルと同様に。

  • -dは、追跡されていないファイルに加えて、追跡されていないディレクトリを削除することを意味します。 

  • 強制的に実行するには-fが必要です。

911
Scott Schafer

警告:これはインデックスされていないローカルファイルを削除します

ただ強制してください:git checkout -f another-branch

518
Régis

あなたがOS Xを使っているならば、それはファイルの名前が大文字と小文字を変える特定の文字を持っていたためかもしれません。次の設定オプションを設定してみてください。

git config core.ignorecase true
122
mattbasta

Gitは(public/system/images/9/...などの名前の)ファイルを作成したいが、そのディレクトリにare n'tがGitによって追跡されている既存のファイルがあることを伝えています。おそらく他の誰かがそれらのファイルをGitリポジトリに追加したのでしょうか、そしてそのブランチに切り替えたのはこれが初めてですか?

おそらく、これらのファイルがdevelopブランチにあるが、現在のブランチにはないのには理由があります。その理由を共同編集者に尋ねる必要があるかもしれません。

これらのファイルを削除せずにブランチを切り替えることができるように、これをどのように機能させるのですか?

ファイルを何らかの形で消さずにそれを行うことはできません。現時点では、publicの名前をmy_publicまたは何かに変更できます。

このブランチに戻った後、最新のコミットまですべてが完璧になりますか?

変更をコミットしても、Gitはそれらを失います。変更をコミットしない場合、Gitは実際に一生懸命に試行しますnot実行した作業を上書きします。これが、Gitが最初のインスタンス(ブランチを切り替えようとしたとき)で警告していることです。

42
Greg Hewgill

この微妙な作業のためのコマンドがあります(未追跡のファイルを永久に削除する)

git clean -i

それからgit pullはします。

21
Abhishek Goel

これは私のために働きました。

 1. git fetch --all
 2. git reset --hard Origin/{branch_name}
14

残念ながら、git rm --cachedgit clean -d -fx ""も私のためにそれをしませんでした。

私の解決策は、私のブランチをリモートにプッシュし、新しいリポジトリを複製し、それから新しいリポジトリにマージすることでした。レポにアクセスする他の人々も同じことをしなければなりませんでした。

物語の道徳的:最初から.gitignoreファイルを使ってください。

11
Kyle Clegg

Scott Schaferの答え

git clean -f

おそらくうまくいくでしょう。 I 非常に 実行を提案する

git clean --dry-run

最初。このコマンドは、git clean -fを実行した場合にGitが削除するファイルのリストを出力するので、不用意に不要なものを削除する手間が省けます。

git cleanの詳細については、 このStack Oveflowの回答 または ドキュメント を参照してください。

10
mc_kaiser

この問題をすぐに解決したい場合は、次のコマンドを使用できます。

git checkout -f dev
9
GeekHades

これは Windows 8 システムで、PromptコマンドのGitを使って私に起こりました。私のチームの残りの部分は _ tfs _ を使い、私はTFSと私のローカルGitリポジトリの間をプッシュ/プルするためにMicrosoftの git-tf を使います。

問題は、いくつかの ファイルの名前を変更するためだけに名前が変更されたために発生しました 。起こったように思われるのはこれでした:

  • ファイルは、名前に大文字と小文字が混在してチェックインされています。
  • 後のコミットで、ファイル名はすべて小文字に変更されました。
  • git-tfは最初、大文字と小文字が混在するファイルを入手しました。
  • ファイルの名前が小文字に変更されたとき、git-tfはファイルを取得できませんでした。Windows8では、これらのファイル名は同等です。
  • Gitは大文字と小文字を区別するので、私はソース管理下にない大文字と小文字が混在するファイルを持っていたと不満を言いました。しかし、git statusを使用しても、Windowsコマンドのプロンプトではこれらのファイル名は同じなので、変更はありません。

私にとって最も簡単な解決策は次のとおりです。

  • git checkout前のバージョン これらのファイルが追加される直前の
  • その後、git checkoutプロジェクトの最新バージョン を、正しいファイルケースを使用してください。
8
Ryan Lundy

以前のコミットに基づいてブランチにチェックアウトしたときにも同じ問題がありました。 Gitはファイルが追跡されていないため、チェックアウトを拒否しました。

私は解決策を見つけました、そしてそれがあなたにも役立つことを願っています。

影響を受けるディレクトリを.gitignoreに追加し、それらに$ git rm -r --cachedを発行することは明らかに十分ではありません。 

何かをテストして現在のバージョンに戻るために、以前のコミットKに基づいてブランチを作成したいとします。私は次のステップでそれをするでしょう:

  1. 追跡されていないファイルを設定します。 .gitignoreを編集し、gitに無視させたいファイルとディレクトリに$ git rm -r --cachedを適用します。ファイル.gitignore自体も.gitignoreに追加して、$ git rm -r --cached .gitignoreを発行することを忘れないでください。これにより、gitの無視動作が以前のコミットでも同じままになります。

  2. 今行った変更をコミットします。

    $ git add -A
    $ git commit

  3. 現在のログを保存してください。そうしないと、現在のバージョンに問題が戻ってくる可能性があります。

    $ git log > ../git.log

  4. コミットKへのハードリセット 

    $ git reset --hard version_k

  5. コミットKに基づいてブランチを作成する

    $ git branch commit_k_branch

  6. そのブランチにチェックアウト

    $ git checkout commit_k_branch 

  7. あなたのことをしてそれをコミットする

  8. もう一度マスターにチェックアウトする

    $ git checkout master

  9. 現在のバージョンに再度リセット

    $ git reset current_versionまたは$ git reset ORIG_HEAD

  10. 今、あなたは激しく頭にリセットすることができます

    git reset --hard HEAD

注意!最後の次のステップをスキップしないでください(例:$ git reset --hard ORIG_HEAD )、それ以外の場合は、上記の不満のあるファイルgitは失われます。

私はまた、gitが苦情を言っているファイルが削除されていないことを確認しました。それらをテキストファイルにコピーして$ for i in $(cat ../test.txt); do ls -ahl $i; doneコマンドを発行しました

上記のブランチに再度チェックアウトする場合は、不要な変更が表示されないように$ git statusを発行することを忘れないでください。

7
Juri Sinitson

私の場合、問題はサブモジュールにありました。 masterはプロジェクトに新しいサブモジュールを追加した別のブランチとマージされました。私がチェックアウトしようとしていたブランチがそれを持っていませんでした、それがgitが追跡されていないファイルについて不平を言っていて、他の提案された解決策がどれも私にとってうまくいかなかった理由です。私は自分の新しいブランチにチェックアウトを強制し、マスターを引っ張りました。

  • git checkout -f my_branch
  • git pull Origin master
  • git submodule update --init
4
Bruno Pinheiro

これら二つの関数(git rm --cached、 git checkout -f another-branch)は私にはうまくいきませんでした。

代わりに、Gitがあなたに指示したように、私はファイルを(Eclipseでは)物理的に削除しました。 分岐を切り替える前に、それらを移動または削除してください。

それから私はそれを追加/コミットしました。

それから私は引っ張ってそれはうまくいった!

3
In-young Choung

私も同様の問題に直面していて、私は上に掲載したすべての解決策を試してみましたが、うまくいきませんでした

この問題は、idevelopブランチの my onMusicUpdateListener.JavaからOnMusicUpdateListener.Javaに名前変更されたときに発生しました。 

これでmasteronMusicUpdateListener.Java を持ち、developOnMusicUpdateListener.Javaと同じファイルを持ちました

今私はマスターに切り替えたときはいつでもそれは私にエラーを与えた

The following untracked working tree files would be overwritten by checkout

そしてそれはabortedです。

これを解決するために、私は強制的にchecked outmaster branch にし、それから私のonMusicUpdateListener.JavaOnMusicUpdateListener.Javacommitted it、そしてmergedそれをdevelop branchに変更します。

それから私は私のdevelopブランチをmergingに更新してmasterにしました。これですべてが正常に戻り問題は解決しました。

3

私の場合、git rm --cachedは機能しませんでした。しかし、私はgit rebaseでそれを得ました

3
Hillkorn

ファイルを削除せずに移動します

ファイルの削除を回避する1つの方法は、代わりにそれらを移動することです。例えば:

cd "`git rev-parse --show-toplevel`"
git checkout 2>&1 | while read f; do [ ! -e "$f" ] || mv "$f" "$f".bak; done
2
gmatht

これは許可の問題になる可能性があります。

所有権を変更する

Sudo chown -v -R usr-name:group-name folder-name
2
Won Jun Bae

同じ名前で大文字小文字が異なる2つのファイルが問題になる可能性があります。

これらのファイルの1つを削除するか、名前を変更することができます。例:

Pdf.html.twig (The GOOD one)

pdf.html.twig (The one I deleted)
2
Samuel Vicent

ファイルの名前をローカルで変更してからpullを実行すると、そのエラーメッセージが表示されます。 

1
lyuboslav kanev

これは簡単に解決できます、gitは両方のブランチに同じファイルがあると言っているので、マスターブランチから特定のファイルを削除しなければなりません。そしてマージすることができます。

git merge "your branch"

それがあなたのために働くことを願っています、私はちょうど私のエラーを解決しました。私のエラーは次のとおりです:

エラー:次の追跡されていない作業ツリーファイルはマージによって上書きされます: .vs/slnx.sqlite マージする前にそれらを移動または削除してください。

これでうまくいきました!私の場合、.vs/slnx.sqliteはビジュアルスタジオによって生成されたので、削除する前に閉じる必要がありました。

1
jeirueda

ほとんどの回答では、ファイルを削除または削除することを検討しています。これが簡単な方法です。しかし時々あなたはローカルファイルを取り除きたくないでしょう。しかし戦略とマージするので、gitもこれに対する解決策を持っています。

git merge --strategy=ours master 
0

私の場合は、このエラーが発生していました。人気のあるオープンソースのCMSを使用していて、問題の原因となっていたディレクトリが、CMSが書き込むアップロードディレクトリだったためです。

それで、それはあなたが持っていないけれどもあなたがバージョン管理から得ることができないファイルがあるということです。

私はライブサイトから私のローカルにすべてのファイルをつかみます、そして私はこれが問題を解決することを願ってリポジトリにこれをチェックインします。

0
Markosaurus

フォルダ名に「/」または特別な記号が付いていないか確認してから、そのフォルダの名前を変更します。その後、リポジトリを別の場所にクローンするだけです。

0
Codemaker

ファイルを削除するか名前を変更するだけです。

例えば 

$ git pull
Enter passphrase for key '/c/Users/PC983/.ssh/id_rsa':
error: Your local changes to the following files would be overwritten by merge:
        ajax/productPrice.php
Please commit your changes or stash them before you merge.
error: The following untracked working tree files would be overwritten by merge:
        ajax/product.php
Please move or remove them before you merge.
Aborting
Updating a04cbe7a..6aa8ead5

私は/ delete ajax/product.php および ajax/produtPrice.php の名前を変更する必要がありました。

心配しないで、git pullすると元に戻ります。一部の変更を失う可能性があるため、削除するのではなく名前を変更することをお勧めします。

これでも解決しない場合は、ブランチ全体を削除してからもう一度作成してからgit pull Origin remotebranchを実行します

0
Black

この問題を解決するには、 appname/gen/ から .gitignore fileを削除します。

0
vishnuc156

変更されたファイルを保存し、後で変更された内容を使用するためにブランチをチェックアウトしようとしたとき、およびリベースしようとしたときにこのエラーが発生しました。 

git stash

私はただファイルシステムに行ってファイルを直接削除し、それからgitチェックアウトを続けてもうまくいきました。

私は何度も問題を起こしました、そしてそれは開発者が削除、プッシュ、再追加、プッシュまたはそのようなことをしていることに関連しているかもしれません。

0
Phil Carter