Git show a bunch of files in my repo as deleted, but they are not
Very strange, suddently, git show most of the files in my repo as removed. ls
shows them, tree
shows them, I can open them.
I try to copy the repository to another folder, git status shows the same...
Any idea how this can happen, and how to solve this ?
EDIT: I managed to solve temporary this by copying only the .git
folder to another directory, git status
this repo, and then copying again all files to the new folder. Then after a while, it reshows the files as deleted...
EDIT2: To solve this, while keeping a copy of all my files, I hard rest to head, and then recopy the backuped files to the repo. Now everything is fine.
EDIT3 (more infos):
I'm keeping a copy of the broken repo folder in case. I let the question open because I'm still wondering how this can happen!
>> cat $(find . -name .gitignore)
git
*.pyc
*.lprof
*.cprof
profile.sh
/doc/
/.idea/
__pycache__
/tmp/
(sorry, in french, I translated as I can). Lots of files, just showing some examples
>> git status
Sur la branche master (on the branch master)
...
Modifications qui seront validées : (modification that will be validated)
(utilisez "git reset HEAD <fichier>..." pour désindexer)
(supprimé = deleted)
supprimé : GUI/MainWindows.py
supprimé : GUI/PathParameters.py
supprimé : GUI/parameter_utils.py
supprimé : GUI/ui/ui_DefaultPathDialog.py
supprimé : GUI/ui/ui_mainGUI.py
supprimé : examples/__init__.py
supprimé : externals/__init__.py
supprimé : main.py
supprimé : tools/searchUtils.py
supprimé : tools/spatial.py
supprimé : tools/utils.py
supprimé : tools/yaml.py
....
Modifications qui ne seront pas validées : (modification that won't' be validated)
(utilisez "git add <fichier>..." pour mettre à jour ce qui sera validé)
(utilisez "git checkout -- <fichier>..." pour annuler les modifications dans la copie de travail)
(modifié = modified)
modifié : GUI/ui/ui_mainGUI.ui
modifié : requirements.txt
Fichiers non suivis: (files not followed)
(utilisez "git add <fichier>..." pour inclure dans ce qui sera validé)
GUI/MainWindows.py
GUI/base/
GUI/parameter_utils.py
GUI/ui/ui_DefaultPathDialog.py
GUI/ui/ui_mainGUI.py
examples/
externals/
main.py
tools/
git diff --cached
shows a buch of the following, with the source code in red. It is very long, I wont put the source here. If you wan't more details, just ask !
>>git diff --cached
diff --git a/GUI/MainWindows.py b/GUI/MainWindows.py
deleted file mode 100644
index c9ef7ac..0000000
--- a/GUI/MainWindows.py
+++ /dev/null
as I explained, ls
shows all the files listed as deleted above
git
|
show 3 more comments
Very strange, suddently, git show most of the files in my repo as removed. ls
shows them, tree
shows them, I can open them.
I try to copy the repository to another folder, git status shows the same...
Any idea how this can happen, and how to solve this ?
EDIT: I managed to solve temporary this by copying only the .git
folder to another directory, git status
this repo, and then copying again all files to the new folder. Then after a while, it reshows the files as deleted...
EDIT2: To solve this, while keeping a copy of all my files, I hard rest to head, and then recopy the backuped files to the repo. Now everything is fine.
EDIT3 (more infos):
I'm keeping a copy of the broken repo folder in case. I let the question open because I'm still wondering how this can happen!
>> cat $(find . -name .gitignore)
git
*.pyc
*.lprof
*.cprof
profile.sh
/doc/
/.idea/
__pycache__
/tmp/
(sorry, in french, I translated as I can). Lots of files, just showing some examples
>> git status
Sur la branche master (on the branch master)
...
Modifications qui seront validées : (modification that will be validated)
(utilisez "git reset HEAD <fichier>..." pour désindexer)
(supprimé = deleted)
supprimé : GUI/MainWindows.py
supprimé : GUI/PathParameters.py
supprimé : GUI/parameter_utils.py
supprimé : GUI/ui/ui_DefaultPathDialog.py
supprimé : GUI/ui/ui_mainGUI.py
supprimé : examples/__init__.py
supprimé : externals/__init__.py
supprimé : main.py
supprimé : tools/searchUtils.py
supprimé : tools/spatial.py
supprimé : tools/utils.py
supprimé : tools/yaml.py
....
Modifications qui ne seront pas validées : (modification that won't' be validated)
(utilisez "git add <fichier>..." pour mettre à jour ce qui sera validé)
(utilisez "git checkout -- <fichier>..." pour annuler les modifications dans la copie de travail)
(modifié = modified)
modifié : GUI/ui/ui_mainGUI.ui
modifié : requirements.txt
Fichiers non suivis: (files not followed)
(utilisez "git add <fichier>..." pour inclure dans ce qui sera validé)
GUI/MainWindows.py
GUI/base/
GUI/parameter_utils.py
GUI/ui/ui_DefaultPathDialog.py
GUI/ui/ui_mainGUI.py
examples/
externals/
main.py
tools/
git diff --cached
shows a buch of the following, with the source code in red. It is very long, I wont put the source here. If you wan't more details, just ask !
>>git diff --cached
diff --git a/GUI/MainWindows.py b/GUI/MainWindows.py
deleted file mode 100644
index c9ef7ac..0000000
--- a/GUI/MainWindows.py
+++ /dev/null
as I explained, ls
shows all the files listed as deleted above
git
Hard to say without a console transcript, but maybe you had a totally different Index state than exp3cted.
– eckes
Nov 21 '18 at 23:05
If you need give the output of some command, just ask! Just don't know what to show... Here, just typinggit status
, shows lots of file tagged as removed, butls
show the file, and I can open them
– beesleep
Nov 21 '18 at 23:12
git status
andgit diff --Index
andcat $(find . -name .gitignore)
and als
for starters. Or are u using git on Windows with some caching services?
– eckes
Nov 21 '18 at 23:21
There is also agit update-Index —really-refresh
, maybe that will help (best to run it on a copy)
– eckes
Nov 21 '18 at 23:23
my git version isgit version 2.19.1
,git diff --Index
showserror: option invalide : --Index
– beesleep
Nov 21 '18 at 23:36
|
show 3 more comments
Very strange, suddently, git show most of the files in my repo as removed. ls
shows them, tree
shows them, I can open them.
I try to copy the repository to another folder, git status shows the same...
Any idea how this can happen, and how to solve this ?
EDIT: I managed to solve temporary this by copying only the .git
folder to another directory, git status
this repo, and then copying again all files to the new folder. Then after a while, it reshows the files as deleted...
EDIT2: To solve this, while keeping a copy of all my files, I hard rest to head, and then recopy the backuped files to the repo. Now everything is fine.
EDIT3 (more infos):
I'm keeping a copy of the broken repo folder in case. I let the question open because I'm still wondering how this can happen!
>> cat $(find . -name .gitignore)
git
*.pyc
*.lprof
*.cprof
profile.sh
/doc/
/.idea/
__pycache__
/tmp/
(sorry, in french, I translated as I can). Lots of files, just showing some examples
>> git status
Sur la branche master (on the branch master)
...
Modifications qui seront validées : (modification that will be validated)
(utilisez "git reset HEAD <fichier>..." pour désindexer)
(supprimé = deleted)
supprimé : GUI/MainWindows.py
supprimé : GUI/PathParameters.py
supprimé : GUI/parameter_utils.py
supprimé : GUI/ui/ui_DefaultPathDialog.py
supprimé : GUI/ui/ui_mainGUI.py
supprimé : examples/__init__.py
supprimé : externals/__init__.py
supprimé : main.py
supprimé : tools/searchUtils.py
supprimé : tools/spatial.py
supprimé : tools/utils.py
supprimé : tools/yaml.py
....
Modifications qui ne seront pas validées : (modification that won't' be validated)
(utilisez "git add <fichier>..." pour mettre à jour ce qui sera validé)
(utilisez "git checkout -- <fichier>..." pour annuler les modifications dans la copie de travail)
(modifié = modified)
modifié : GUI/ui/ui_mainGUI.ui
modifié : requirements.txt
Fichiers non suivis: (files not followed)
(utilisez "git add <fichier>..." pour inclure dans ce qui sera validé)
GUI/MainWindows.py
GUI/base/
GUI/parameter_utils.py
GUI/ui/ui_DefaultPathDialog.py
GUI/ui/ui_mainGUI.py
examples/
externals/
main.py
tools/
git diff --cached
shows a buch of the following, with the source code in red. It is very long, I wont put the source here. If you wan't more details, just ask !
>>git diff --cached
diff --git a/GUI/MainWindows.py b/GUI/MainWindows.py
deleted file mode 100644
index c9ef7ac..0000000
--- a/GUI/MainWindows.py
+++ /dev/null
as I explained, ls
shows all the files listed as deleted above
git
Very strange, suddently, git show most of the files in my repo as removed. ls
shows them, tree
shows them, I can open them.
I try to copy the repository to another folder, git status shows the same...
Any idea how this can happen, and how to solve this ?
EDIT: I managed to solve temporary this by copying only the .git
folder to another directory, git status
this repo, and then copying again all files to the new folder. Then after a while, it reshows the files as deleted...
EDIT2: To solve this, while keeping a copy of all my files, I hard rest to head, and then recopy the backuped files to the repo. Now everything is fine.
EDIT3 (more infos):
I'm keeping a copy of the broken repo folder in case. I let the question open because I'm still wondering how this can happen!
>> cat $(find . -name .gitignore)
git
*.pyc
*.lprof
*.cprof
profile.sh
/doc/
/.idea/
__pycache__
/tmp/
(sorry, in french, I translated as I can). Lots of files, just showing some examples
>> git status
Sur la branche master (on the branch master)
...
Modifications qui seront validées : (modification that will be validated)
(utilisez "git reset HEAD <fichier>..." pour désindexer)
(supprimé = deleted)
supprimé : GUI/MainWindows.py
supprimé : GUI/PathParameters.py
supprimé : GUI/parameter_utils.py
supprimé : GUI/ui/ui_DefaultPathDialog.py
supprimé : GUI/ui/ui_mainGUI.py
supprimé : examples/__init__.py
supprimé : externals/__init__.py
supprimé : main.py
supprimé : tools/searchUtils.py
supprimé : tools/spatial.py
supprimé : tools/utils.py
supprimé : tools/yaml.py
....
Modifications qui ne seront pas validées : (modification that won't' be validated)
(utilisez "git add <fichier>..." pour mettre à jour ce qui sera validé)
(utilisez "git checkout -- <fichier>..." pour annuler les modifications dans la copie de travail)
(modifié = modified)
modifié : GUI/ui/ui_mainGUI.ui
modifié : requirements.txt
Fichiers non suivis: (files not followed)
(utilisez "git add <fichier>..." pour inclure dans ce qui sera validé)
GUI/MainWindows.py
GUI/base/
GUI/parameter_utils.py
GUI/ui/ui_DefaultPathDialog.py
GUI/ui/ui_mainGUI.py
examples/
externals/
main.py
tools/
git diff --cached
shows a buch of the following, with the source code in red. It is very long, I wont put the source here. If you wan't more details, just ask !
>>git diff --cached
diff --git a/GUI/MainWindows.py b/GUI/MainWindows.py
deleted file mode 100644
index c9ef7ac..0000000
--- a/GUI/MainWindows.py
+++ /dev/null
as I explained, ls
shows all the files listed as deleted above
git
git
edited Nov 21 '18 at 23:53
beesleep
asked Nov 21 '18 at 22:50
beesleepbeesleep
616312
616312
Hard to say without a console transcript, but maybe you had a totally different Index state than exp3cted.
– eckes
Nov 21 '18 at 23:05
If you need give the output of some command, just ask! Just don't know what to show... Here, just typinggit status
, shows lots of file tagged as removed, butls
show the file, and I can open them
– beesleep
Nov 21 '18 at 23:12
git status
andgit diff --Index
andcat $(find . -name .gitignore)
and als
for starters. Or are u using git on Windows with some caching services?
– eckes
Nov 21 '18 at 23:21
There is also agit update-Index —really-refresh
, maybe that will help (best to run it on a copy)
– eckes
Nov 21 '18 at 23:23
my git version isgit version 2.19.1
,git diff --Index
showserror: option invalide : --Index
– beesleep
Nov 21 '18 at 23:36
|
show 3 more comments
Hard to say without a console transcript, but maybe you had a totally different Index state than exp3cted.
– eckes
Nov 21 '18 at 23:05
If you need give the output of some command, just ask! Just don't know what to show... Here, just typinggit status
, shows lots of file tagged as removed, butls
show the file, and I can open them
– beesleep
Nov 21 '18 at 23:12
git status
andgit diff --Index
andcat $(find . -name .gitignore)
and als
for starters. Or are u using git on Windows with some caching services?
– eckes
Nov 21 '18 at 23:21
There is also agit update-Index —really-refresh
, maybe that will help (best to run it on a copy)
– eckes
Nov 21 '18 at 23:23
my git version isgit version 2.19.1
,git diff --Index
showserror: option invalide : --Index
– beesleep
Nov 21 '18 at 23:36
Hard to say without a console transcript, but maybe you had a totally different Index state than exp3cted.
– eckes
Nov 21 '18 at 23:05
Hard to say without a console transcript, but maybe you had a totally different Index state than exp3cted.
– eckes
Nov 21 '18 at 23:05
If you need give the output of some command, just ask! Just don't know what to show... Here, just typing
git status
, shows lots of file tagged as removed, but ls
show the file, and I can open them– beesleep
Nov 21 '18 at 23:12
If you need give the output of some command, just ask! Just don't know what to show... Here, just typing
git status
, shows lots of file tagged as removed, but ls
show the file, and I can open them– beesleep
Nov 21 '18 at 23:12
git status
and git diff --Index
and cat $(find . -name .gitignore)
and a ls
for starters. Or are u using git on Windows with some caching services?– eckes
Nov 21 '18 at 23:21
git status
and git diff --Index
and cat $(find . -name .gitignore)
and a ls
for starters. Or are u using git on Windows with some caching services?– eckes
Nov 21 '18 at 23:21
There is also a
git update-Index —really-refresh
, maybe that will help (best to run it on a copy)– eckes
Nov 21 '18 at 23:23
There is also a
git update-Index —really-refresh
, maybe that will help (best to run it on a copy)– eckes
Nov 21 '18 at 23:23
my git version is
git version 2.19.1
, git diff --Index
shows error: option invalide : --Index
– beesleep
Nov 21 '18 at 23:36
my git version is
git version 2.19.1
, git diff --Index
shows error: option invalide : --Index
– beesleep
Nov 21 '18 at 23:36
|
show 3 more comments
1 Answer
1
active
oldest
votes
Changes that are "to be committed" are those stored in the index (aka staging area aka cache). Git makes new commits from whatever is in the index right now, so a good description of the index is that it is what you are proposing to commit.
If you copied the repository, but did not copy the index (or copied it in some way that did not retain all of it), that would explain the problem. The index is neither the repository itself, nor the work-tree. Instead, the index sits between the repository and the work-tree. So the files can be there, in the work-tree, in fine order, but be missing from the index, and Git will tell you that a removal will be committed if you commit now.
You can tell Git to re-fill the index from the current commit, using git reset --mixed
. Or, you can write specified (or all) work-tree files using git add
. That is:
git reset --mixed
: copy (all files) fromHEAD
to index
git add file
: copy (the one specifiedfile
) from work-tree to index
If you view the index as being between the HEAD
commit and the work-tree, this all makes more sense:
HEAD index work-tree
---------- ---------- ----------
README.txt README.txt README.txt
file.ext file.ext file.ext
main.py main.py main.py
The
HEAD
copy of each file is read-only: no commit can ever be changed, and it's a committed copy. These files are compressed—maybe highly compressed—and in a special, Git-only format.The index copy of each file is Git-only, like the
HEAD
copy, except that it's read/write: it has been unfrozen. The next commit will use the index copy, by freezing it (and once all the files are frozen and the commit is done, that index copy becomes theHEAD
copy becauseHEAD
changes to the new commit).The work-tree copy of each file is a normal file, in its normal form. Git doesn't use it to make commits. Git doesn't care very much about it, really; Git just provides it for you to use, work with, and maybe change if you like.
Once you've changed a file, you use git add
to copy it back into the index, overwriting the old index copy. The add
process compresses and Git-ifies the file, so that it's ready to be committed.
The git commit
command takes whatever's in the index right now and freezes that into a new commit. The new commit becomes the HEAD
commit.
When you first run git checkout branch
, Git fills in the index and work-tree from the tip commit of branch
. That commit becomes the HEAD
commit, and the HEAD
and index match. When you make a new commit, that new commit becomes the tip of the current branch, and the HEAD
and index match. Note how the work-tree was merely an output of the initial checkout, not an input of the new commit. (It was, or rather some files in it were, put into to the index if you git add
-ed some or all files.)
Normally you would remove files from the index using git rm
:
git rm file
removesfile
from both the index and the work-tree; or
git rm file
removesfile
from the index, but leaves it alone in the work-tree.
Either way, after removing, say, file.ext
from the index, you still have it in HEAD
, so you have one of these two results:
HEAD index work-tree
---------- ---------- ----------
README.txt README.txt README.txt
file.ext file.ext
main.py main.py main.py
or:
HEAD index work-tree
---------- ---------- ----------
README.txt README.txt README.txt
file.ext
main.py main.py main.py
Looking in the work-tree won't tell you that the file's gone from the index, it will only tell you whether the file is gone from the work-tree. But git status
will tell you, because git status
runs two git diff
s:
First,
git status
compares theHEAD
commit to the index. Whatever's different, Git tells you is a "change to be committed" ("qui seront validées", I guess). Whatever's the same, Git says nothing about.Then,
git status
compares the index to the work-tree. Whatever's different, Git tells you is a change that is not—at least, not yet—slated to be committed. You couldgit add
the updated file into the index, of course; after that, the first comparison,HEAD
vs index, will show something different.A file that is not in the index, but is in the work-tree, is said to be untracked ("non suivis"). This is true even if the file is in the
HEAD
commit. (Note, however, that you can suppress this complaint about untracked files by listing the file, or a pattern for it, in.gitignore
.)
Conclusion: the files are in HEAD
and the work-tree but not in the index
The output you showed is just what one should expect for this case. The file is in HEAD
but not in the index: it will be missing from the next commit, unless you put it back into the index. And the file is not in the index, but is in the work-tree: it is untracked.
Thanks! That indeed fixed the broken repo. Do you have an idea how the files can be deleted from the index suddently ?
– beesleep
Nov 22 '18 at 13:09
Under normal conditions, onlygit rm --cached
would remove a file from the index while leaving it in the work-tree. If you set up a VM with a shared folder, or try to run Git over Dropbox or similar sharing systems, though, these not-normal conditions can cause Git data to become corrupted (including the repository itself). So it's a good idea to keep Git repositories purely local.
– torek
Nov 22 '18 at 17:58
My git is purely local. Haven't run anything likegit rm --cached
myself, but maybe smartgit did corrupt the repo
– beesleep
Nov 23 '18 at 10:53
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53421527%2fgit-show-a-bunch-of-files-in-my-repo-as-deleted-but-they-are-not%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Changes that are "to be committed" are those stored in the index (aka staging area aka cache). Git makes new commits from whatever is in the index right now, so a good description of the index is that it is what you are proposing to commit.
If you copied the repository, but did not copy the index (or copied it in some way that did not retain all of it), that would explain the problem. The index is neither the repository itself, nor the work-tree. Instead, the index sits between the repository and the work-tree. So the files can be there, in the work-tree, in fine order, but be missing from the index, and Git will tell you that a removal will be committed if you commit now.
You can tell Git to re-fill the index from the current commit, using git reset --mixed
. Or, you can write specified (or all) work-tree files using git add
. That is:
git reset --mixed
: copy (all files) fromHEAD
to index
git add file
: copy (the one specifiedfile
) from work-tree to index
If you view the index as being between the HEAD
commit and the work-tree, this all makes more sense:
HEAD index work-tree
---------- ---------- ----------
README.txt README.txt README.txt
file.ext file.ext file.ext
main.py main.py main.py
The
HEAD
copy of each file is read-only: no commit can ever be changed, and it's a committed copy. These files are compressed—maybe highly compressed—and in a special, Git-only format.The index copy of each file is Git-only, like the
HEAD
copy, except that it's read/write: it has been unfrozen. The next commit will use the index copy, by freezing it (and once all the files are frozen and the commit is done, that index copy becomes theHEAD
copy becauseHEAD
changes to the new commit).The work-tree copy of each file is a normal file, in its normal form. Git doesn't use it to make commits. Git doesn't care very much about it, really; Git just provides it for you to use, work with, and maybe change if you like.
Once you've changed a file, you use git add
to copy it back into the index, overwriting the old index copy. The add
process compresses and Git-ifies the file, so that it's ready to be committed.
The git commit
command takes whatever's in the index right now and freezes that into a new commit. The new commit becomes the HEAD
commit.
When you first run git checkout branch
, Git fills in the index and work-tree from the tip commit of branch
. That commit becomes the HEAD
commit, and the HEAD
and index match. When you make a new commit, that new commit becomes the tip of the current branch, and the HEAD
and index match. Note how the work-tree was merely an output of the initial checkout, not an input of the new commit. (It was, or rather some files in it were, put into to the index if you git add
-ed some or all files.)
Normally you would remove files from the index using git rm
:
git rm file
removesfile
from both the index and the work-tree; or
git rm file
removesfile
from the index, but leaves it alone in the work-tree.
Either way, after removing, say, file.ext
from the index, you still have it in HEAD
, so you have one of these two results:
HEAD index work-tree
---------- ---------- ----------
README.txt README.txt README.txt
file.ext file.ext
main.py main.py main.py
or:
HEAD index work-tree
---------- ---------- ----------
README.txt README.txt README.txt
file.ext
main.py main.py main.py
Looking in the work-tree won't tell you that the file's gone from the index, it will only tell you whether the file is gone from the work-tree. But git status
will tell you, because git status
runs two git diff
s:
First,
git status
compares theHEAD
commit to the index. Whatever's different, Git tells you is a "change to be committed" ("qui seront validées", I guess). Whatever's the same, Git says nothing about.Then,
git status
compares the index to the work-tree. Whatever's different, Git tells you is a change that is not—at least, not yet—slated to be committed. You couldgit add
the updated file into the index, of course; after that, the first comparison,HEAD
vs index, will show something different.A file that is not in the index, but is in the work-tree, is said to be untracked ("non suivis"). This is true even if the file is in the
HEAD
commit. (Note, however, that you can suppress this complaint about untracked files by listing the file, or a pattern for it, in.gitignore
.)
Conclusion: the files are in HEAD
and the work-tree but not in the index
The output you showed is just what one should expect for this case. The file is in HEAD
but not in the index: it will be missing from the next commit, unless you put it back into the index. And the file is not in the index, but is in the work-tree: it is untracked.
Thanks! That indeed fixed the broken repo. Do you have an idea how the files can be deleted from the index suddently ?
– beesleep
Nov 22 '18 at 13:09
Under normal conditions, onlygit rm --cached
would remove a file from the index while leaving it in the work-tree. If you set up a VM with a shared folder, or try to run Git over Dropbox or similar sharing systems, though, these not-normal conditions can cause Git data to become corrupted (including the repository itself). So it's a good idea to keep Git repositories purely local.
– torek
Nov 22 '18 at 17:58
My git is purely local. Haven't run anything likegit rm --cached
myself, but maybe smartgit did corrupt the repo
– beesleep
Nov 23 '18 at 10:53
add a comment |
Changes that are "to be committed" are those stored in the index (aka staging area aka cache). Git makes new commits from whatever is in the index right now, so a good description of the index is that it is what you are proposing to commit.
If you copied the repository, but did not copy the index (or copied it in some way that did not retain all of it), that would explain the problem. The index is neither the repository itself, nor the work-tree. Instead, the index sits between the repository and the work-tree. So the files can be there, in the work-tree, in fine order, but be missing from the index, and Git will tell you that a removal will be committed if you commit now.
You can tell Git to re-fill the index from the current commit, using git reset --mixed
. Or, you can write specified (or all) work-tree files using git add
. That is:
git reset --mixed
: copy (all files) fromHEAD
to index
git add file
: copy (the one specifiedfile
) from work-tree to index
If you view the index as being between the HEAD
commit and the work-tree, this all makes more sense:
HEAD index work-tree
---------- ---------- ----------
README.txt README.txt README.txt
file.ext file.ext file.ext
main.py main.py main.py
The
HEAD
copy of each file is read-only: no commit can ever be changed, and it's a committed copy. These files are compressed—maybe highly compressed—and in a special, Git-only format.The index copy of each file is Git-only, like the
HEAD
copy, except that it's read/write: it has been unfrozen. The next commit will use the index copy, by freezing it (and once all the files are frozen and the commit is done, that index copy becomes theHEAD
copy becauseHEAD
changes to the new commit).The work-tree copy of each file is a normal file, in its normal form. Git doesn't use it to make commits. Git doesn't care very much about it, really; Git just provides it for you to use, work with, and maybe change if you like.
Once you've changed a file, you use git add
to copy it back into the index, overwriting the old index copy. The add
process compresses and Git-ifies the file, so that it's ready to be committed.
The git commit
command takes whatever's in the index right now and freezes that into a new commit. The new commit becomes the HEAD
commit.
When you first run git checkout branch
, Git fills in the index and work-tree from the tip commit of branch
. That commit becomes the HEAD
commit, and the HEAD
and index match. When you make a new commit, that new commit becomes the tip of the current branch, and the HEAD
and index match. Note how the work-tree was merely an output of the initial checkout, not an input of the new commit. (It was, or rather some files in it were, put into to the index if you git add
-ed some or all files.)
Normally you would remove files from the index using git rm
:
git rm file
removesfile
from both the index and the work-tree; or
git rm file
removesfile
from the index, but leaves it alone in the work-tree.
Either way, after removing, say, file.ext
from the index, you still have it in HEAD
, so you have one of these two results:
HEAD index work-tree
---------- ---------- ----------
README.txt README.txt README.txt
file.ext file.ext
main.py main.py main.py
or:
HEAD index work-tree
---------- ---------- ----------
README.txt README.txt README.txt
file.ext
main.py main.py main.py
Looking in the work-tree won't tell you that the file's gone from the index, it will only tell you whether the file is gone from the work-tree. But git status
will tell you, because git status
runs two git diff
s:
First,
git status
compares theHEAD
commit to the index. Whatever's different, Git tells you is a "change to be committed" ("qui seront validées", I guess). Whatever's the same, Git says nothing about.Then,
git status
compares the index to the work-tree. Whatever's different, Git tells you is a change that is not—at least, not yet—slated to be committed. You couldgit add
the updated file into the index, of course; after that, the first comparison,HEAD
vs index, will show something different.A file that is not in the index, but is in the work-tree, is said to be untracked ("non suivis"). This is true even if the file is in the
HEAD
commit. (Note, however, that you can suppress this complaint about untracked files by listing the file, or a pattern for it, in.gitignore
.)
Conclusion: the files are in HEAD
and the work-tree but not in the index
The output you showed is just what one should expect for this case. The file is in HEAD
but not in the index: it will be missing from the next commit, unless you put it back into the index. And the file is not in the index, but is in the work-tree: it is untracked.
Thanks! That indeed fixed the broken repo. Do you have an idea how the files can be deleted from the index suddently ?
– beesleep
Nov 22 '18 at 13:09
Under normal conditions, onlygit rm --cached
would remove a file from the index while leaving it in the work-tree. If you set up a VM with a shared folder, or try to run Git over Dropbox or similar sharing systems, though, these not-normal conditions can cause Git data to become corrupted (including the repository itself). So it's a good idea to keep Git repositories purely local.
– torek
Nov 22 '18 at 17:58
My git is purely local. Haven't run anything likegit rm --cached
myself, but maybe smartgit did corrupt the repo
– beesleep
Nov 23 '18 at 10:53
add a comment |
Changes that are "to be committed" are those stored in the index (aka staging area aka cache). Git makes new commits from whatever is in the index right now, so a good description of the index is that it is what you are proposing to commit.
If you copied the repository, but did not copy the index (or copied it in some way that did not retain all of it), that would explain the problem. The index is neither the repository itself, nor the work-tree. Instead, the index sits between the repository and the work-tree. So the files can be there, in the work-tree, in fine order, but be missing from the index, and Git will tell you that a removal will be committed if you commit now.
You can tell Git to re-fill the index from the current commit, using git reset --mixed
. Or, you can write specified (or all) work-tree files using git add
. That is:
git reset --mixed
: copy (all files) fromHEAD
to index
git add file
: copy (the one specifiedfile
) from work-tree to index
If you view the index as being between the HEAD
commit and the work-tree, this all makes more sense:
HEAD index work-tree
---------- ---------- ----------
README.txt README.txt README.txt
file.ext file.ext file.ext
main.py main.py main.py
The
HEAD
copy of each file is read-only: no commit can ever be changed, and it's a committed copy. These files are compressed—maybe highly compressed—and in a special, Git-only format.The index copy of each file is Git-only, like the
HEAD
copy, except that it's read/write: it has been unfrozen. The next commit will use the index copy, by freezing it (and once all the files are frozen and the commit is done, that index copy becomes theHEAD
copy becauseHEAD
changes to the new commit).The work-tree copy of each file is a normal file, in its normal form. Git doesn't use it to make commits. Git doesn't care very much about it, really; Git just provides it for you to use, work with, and maybe change if you like.
Once you've changed a file, you use git add
to copy it back into the index, overwriting the old index copy. The add
process compresses and Git-ifies the file, so that it's ready to be committed.
The git commit
command takes whatever's in the index right now and freezes that into a new commit. The new commit becomes the HEAD
commit.
When you first run git checkout branch
, Git fills in the index and work-tree from the tip commit of branch
. That commit becomes the HEAD
commit, and the HEAD
and index match. When you make a new commit, that new commit becomes the tip of the current branch, and the HEAD
and index match. Note how the work-tree was merely an output of the initial checkout, not an input of the new commit. (It was, or rather some files in it were, put into to the index if you git add
-ed some or all files.)
Normally you would remove files from the index using git rm
:
git rm file
removesfile
from both the index and the work-tree; or
git rm file
removesfile
from the index, but leaves it alone in the work-tree.
Either way, after removing, say, file.ext
from the index, you still have it in HEAD
, so you have one of these two results:
HEAD index work-tree
---------- ---------- ----------
README.txt README.txt README.txt
file.ext file.ext
main.py main.py main.py
or:
HEAD index work-tree
---------- ---------- ----------
README.txt README.txt README.txt
file.ext
main.py main.py main.py
Looking in the work-tree won't tell you that the file's gone from the index, it will only tell you whether the file is gone from the work-tree. But git status
will tell you, because git status
runs two git diff
s:
First,
git status
compares theHEAD
commit to the index. Whatever's different, Git tells you is a "change to be committed" ("qui seront validées", I guess). Whatever's the same, Git says nothing about.Then,
git status
compares the index to the work-tree. Whatever's different, Git tells you is a change that is not—at least, not yet—slated to be committed. You couldgit add
the updated file into the index, of course; after that, the first comparison,HEAD
vs index, will show something different.A file that is not in the index, but is in the work-tree, is said to be untracked ("non suivis"). This is true even if the file is in the
HEAD
commit. (Note, however, that you can suppress this complaint about untracked files by listing the file, or a pattern for it, in.gitignore
.)
Conclusion: the files are in HEAD
and the work-tree but not in the index
The output you showed is just what one should expect for this case. The file is in HEAD
but not in the index: it will be missing from the next commit, unless you put it back into the index. And the file is not in the index, but is in the work-tree: it is untracked.
Changes that are "to be committed" are those stored in the index (aka staging area aka cache). Git makes new commits from whatever is in the index right now, so a good description of the index is that it is what you are proposing to commit.
If you copied the repository, but did not copy the index (or copied it in some way that did not retain all of it), that would explain the problem. The index is neither the repository itself, nor the work-tree. Instead, the index sits between the repository and the work-tree. So the files can be there, in the work-tree, in fine order, but be missing from the index, and Git will tell you that a removal will be committed if you commit now.
You can tell Git to re-fill the index from the current commit, using git reset --mixed
. Or, you can write specified (or all) work-tree files using git add
. That is:
git reset --mixed
: copy (all files) fromHEAD
to index
git add file
: copy (the one specifiedfile
) from work-tree to index
If you view the index as being between the HEAD
commit and the work-tree, this all makes more sense:
HEAD index work-tree
---------- ---------- ----------
README.txt README.txt README.txt
file.ext file.ext file.ext
main.py main.py main.py
The
HEAD
copy of each file is read-only: no commit can ever be changed, and it's a committed copy. These files are compressed—maybe highly compressed—and in a special, Git-only format.The index copy of each file is Git-only, like the
HEAD
copy, except that it's read/write: it has been unfrozen. The next commit will use the index copy, by freezing it (and once all the files are frozen and the commit is done, that index copy becomes theHEAD
copy becauseHEAD
changes to the new commit).The work-tree copy of each file is a normal file, in its normal form. Git doesn't use it to make commits. Git doesn't care very much about it, really; Git just provides it for you to use, work with, and maybe change if you like.
Once you've changed a file, you use git add
to copy it back into the index, overwriting the old index copy. The add
process compresses and Git-ifies the file, so that it's ready to be committed.
The git commit
command takes whatever's in the index right now and freezes that into a new commit. The new commit becomes the HEAD
commit.
When you first run git checkout branch
, Git fills in the index and work-tree from the tip commit of branch
. That commit becomes the HEAD
commit, and the HEAD
and index match. When you make a new commit, that new commit becomes the tip of the current branch, and the HEAD
and index match. Note how the work-tree was merely an output of the initial checkout, not an input of the new commit. (It was, or rather some files in it were, put into to the index if you git add
-ed some or all files.)
Normally you would remove files from the index using git rm
:
git rm file
removesfile
from both the index and the work-tree; or
git rm file
removesfile
from the index, but leaves it alone in the work-tree.
Either way, after removing, say, file.ext
from the index, you still have it in HEAD
, so you have one of these two results:
HEAD index work-tree
---------- ---------- ----------
README.txt README.txt README.txt
file.ext file.ext
main.py main.py main.py
or:
HEAD index work-tree
---------- ---------- ----------
README.txt README.txt README.txt
file.ext
main.py main.py main.py
Looking in the work-tree won't tell you that the file's gone from the index, it will only tell you whether the file is gone from the work-tree. But git status
will tell you, because git status
runs two git diff
s:
First,
git status
compares theHEAD
commit to the index. Whatever's different, Git tells you is a "change to be committed" ("qui seront validées", I guess). Whatever's the same, Git says nothing about.Then,
git status
compares the index to the work-tree. Whatever's different, Git tells you is a change that is not—at least, not yet—slated to be committed. You couldgit add
the updated file into the index, of course; after that, the first comparison,HEAD
vs index, will show something different.A file that is not in the index, but is in the work-tree, is said to be untracked ("non suivis"). This is true even if the file is in the
HEAD
commit. (Note, however, that you can suppress this complaint about untracked files by listing the file, or a pattern for it, in.gitignore
.)
Conclusion: the files are in HEAD
and the work-tree but not in the index
The output you showed is just what one should expect for this case. The file is in HEAD
but not in the index: it will be missing from the next commit, unless you put it back into the index. And the file is not in the index, but is in the work-tree: it is untracked.
answered Nov 22 '18 at 1:24
torektorek
185k18235317
185k18235317
Thanks! That indeed fixed the broken repo. Do you have an idea how the files can be deleted from the index suddently ?
– beesleep
Nov 22 '18 at 13:09
Under normal conditions, onlygit rm --cached
would remove a file from the index while leaving it in the work-tree. If you set up a VM with a shared folder, or try to run Git over Dropbox or similar sharing systems, though, these not-normal conditions can cause Git data to become corrupted (including the repository itself). So it's a good idea to keep Git repositories purely local.
– torek
Nov 22 '18 at 17:58
My git is purely local. Haven't run anything likegit rm --cached
myself, but maybe smartgit did corrupt the repo
– beesleep
Nov 23 '18 at 10:53
add a comment |
Thanks! That indeed fixed the broken repo. Do you have an idea how the files can be deleted from the index suddently ?
– beesleep
Nov 22 '18 at 13:09
Under normal conditions, onlygit rm --cached
would remove a file from the index while leaving it in the work-tree. If you set up a VM with a shared folder, or try to run Git over Dropbox or similar sharing systems, though, these not-normal conditions can cause Git data to become corrupted (including the repository itself). So it's a good idea to keep Git repositories purely local.
– torek
Nov 22 '18 at 17:58
My git is purely local. Haven't run anything likegit rm --cached
myself, but maybe smartgit did corrupt the repo
– beesleep
Nov 23 '18 at 10:53
Thanks! That indeed fixed the broken repo. Do you have an idea how the files can be deleted from the index suddently ?
– beesleep
Nov 22 '18 at 13:09
Thanks! That indeed fixed the broken repo. Do you have an idea how the files can be deleted from the index suddently ?
– beesleep
Nov 22 '18 at 13:09
Under normal conditions, only
git rm --cached
would remove a file from the index while leaving it in the work-tree. If you set up a VM with a shared folder, or try to run Git over Dropbox or similar sharing systems, though, these not-normal conditions can cause Git data to become corrupted (including the repository itself). So it's a good idea to keep Git repositories purely local.– torek
Nov 22 '18 at 17:58
Under normal conditions, only
git rm --cached
would remove a file from the index while leaving it in the work-tree. If you set up a VM with a shared folder, or try to run Git over Dropbox or similar sharing systems, though, these not-normal conditions can cause Git data to become corrupted (including the repository itself). So it's a good idea to keep Git repositories purely local.– torek
Nov 22 '18 at 17:58
My git is purely local. Haven't run anything like
git rm --cached
myself, but maybe smartgit did corrupt the repo– beesleep
Nov 23 '18 at 10:53
My git is purely local. Haven't run anything like
git rm --cached
myself, but maybe smartgit did corrupt the repo– beesleep
Nov 23 '18 at 10:53
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53421527%2fgit-show-a-bunch-of-files-in-my-repo-as-deleted-but-they-are-not%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Hard to say without a console transcript, but maybe you had a totally different Index state than exp3cted.
– eckes
Nov 21 '18 at 23:05
If you need give the output of some command, just ask! Just don't know what to show... Here, just typing
git status
, shows lots of file tagged as removed, butls
show the file, and I can open them– beesleep
Nov 21 '18 at 23:12
git status
andgit diff --Index
andcat $(find . -name .gitignore)
and als
for starters. Or are u using git on Windows with some caching services?– eckes
Nov 21 '18 at 23:21
There is also a
git update-Index —really-refresh
, maybe that will help (best to run it on a copy)– eckes
Nov 21 '18 at 23:23
my git version is
git version 2.19.1
,git diff --Index
showserror: option invalide : --Index
– beesleep
Nov 21 '18 at 23:36