在特定提交时在脏目录中初始化Git
我在本地有一个Git repo,它的文件通过FTP上传到服务器上。我不想一个接一个地上传文件,所以我也尝试在服务器上设置Git。这将允许我简单地使用SSH和git从GitHub中拉取文件 因为我已经在服务器上有了最新版本的文件,所以我想在最新提交时初始化存储库,Git不应该对这些文件做任何操作,因为它们是相同的。然而,事实并非如此:在特定提交时在脏目录中初始化Git,git,Git,我在本地有一个Git repo,它的文件通过FTP上传到服务器上。我不想一个接一个地上传文件,所以我也尝试在服务器上设置Git。这将允许我简单地使用SSH和git从GitHub中拉取文件 因为我已经在服务器上有了最新版本的文件,所以我想在最新提交时初始化存储库,Git不应该对这些文件做任何操作,因为它们是相同的。然而,事实并非如此: ssh myserver cd /path/to/project git init git remote add origin https://github.com
ssh myserver
cd /path/to/project
git init
git remote add origin https://github.com/user/repo
git fetch
git checkout master
最后一个命令输出:
错误:签出将覆盖以下未跟踪的工作树文件:
请在切换分支之前移动或删除它们
流产
为什么会这样?Git想要覆盖的文件及其内容完全相同。签出不应该没有问题吗?此错误的关键部分是“未跟踪”一词:
错误:签出将覆盖以下未跟踪的工作树文件:
这是因为您创建的Git存储库(Git init
)有一个索引,但该索引当前为空。1因此,工作树中的每个文件都未跟踪。Git不会继续比较内容:在Git看来,不跟踪文件就足以导致问题
诀窍是填充索引。考虑到您希望建议的下一个提交2包含当前由名称origin/master
标识的提交中的文件,一种简单的方法是:
git read-tree origin/master
您现在可以git checkout master
从origin/master
创建分支master
,保留工作树文件
(您也可以使用git add
,从工作树中按原样填充索引。只要工作树的文件及其内容与origin/master
标识的提交中的内容匹配,任何一种方法都可以)
1A真正的空索引与索引与
HEAD
commit匹配的情况非常不同。如果索引为空,下一次提交将快照。成功签出空树将从工作树中删除所有跟踪文件,现在将根本没有跟踪文件
2除了在合并过程中承担扩展角色外,索引可能最好描述为您建议的下一次提交。一个git checkout
操作用您要签出的提交中的文件填充索引,并且在此过程中,还将这些文件复制到工作树
我们将从提交中填充索引,而不将文件复制到工作树。这可能是因为某些已更改/未跟踪的文件位于本地repo中,或者您位于本地repo的其他分支中,并且当您尝试签出master时,它正试图覆盖这些文件。最好使用
git clone
,然后可以使用git pull通过远程repo跟踪工作树。当运行git diff
时,您可能会看到这个问题。过来看: