在Git push之后,远程仓库显示文件已被删除

4
我无法在远程仓库中找到任何文件。
  1. 按照他们的教程在共享主机(site5)上创建了一个Git仓库。
  2. 初始化并添加了一个简单的文本文件。好的。
  3. 克隆到我的本地(WinXP)计算机。好的。
  4. 删除了本地副本中的测试文件,添加了一些真实文件。好的。
  5. 提交本地更改。好的。
  6. 推送到远程服务器。好的。
  7. MsysGit抛出了一些警告(如下所示),但告诉我我们成功了。
  8. FTP登录到远程服务器,但文件不在那里
  9. 使用PUTTY SSH登录并运行git status。它给了我整个列表,但每个文件前面都有“已删除”一词。见下文。

根据我不在任何分支上的提示,我检查了特定的提交。它找到了,但是文件和git status仍然没有任何反应。它告诉我:

注意:移动到不是本地分支的“9c47b5”

尝试检出主HEAD。没用,它告诉我

-jailshell:/usr/bin/git:没有那个文件或目录


Git状态显示:

[frumwebc@your tanee.com]$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       deleted:    _notes/dwsync.xml
#       deleted:    contact-us/_notes/dwsync.xml
#       deleted:    contact-us/index.html
#

警告如下:
warning: updating the current branch
warning: Updating the currently checked out branch may cause confusion,
warning: as the index and work tree do not reflect changes that are in HEAD.
warning: As a result, you may see the changes you just pushed into it
warning: reverted when you run 'git diff' over there, and you may want
warning: to run 'git reset --hard' before starting to work to recover.
warning: 
warning: You can set 'receive.denyCurrentBranch' configuration variable to
warning: 'refuse' in the remote repository to forbid pushing into its
warning: current branch.
warning: To allow pushing into the current branch, you can set it to 'ignore';
warning: but this is not recommended unless you arranged to update its work
warning: tree to match what you pushed in some other way.
warning: 
warning: To squelch this message, you can set it to 'warn'.
warning: 
warning: Note that the default will change in a future version of git
warning: to refuse updating the current branch unless you have the
warning: configuration variable set to either 'ignore' or 'warn'.
Pushing to fru@67......ee.com
To fru@67......ee.com/26d352f..9c47b55  master -> master

2
尝试在远程仓库中使用 git reset --hard 命令来恢复丢失的文件。 - user229044
@meager:谢谢,这个方法有效。如果您能够友好地解释一下正在发生的事情并将其发布为答案,我将很高兴给予认可。 - SamGoody
发生了什么事情,确切地在警告中描述了。这种精确的情况正是为什么首先添加这些警告的全部原因! - Jörg W Mittag
3个回答

6
当你在Git中向远程仓库推送时,它不会更新该远程仓库的工作副本。这意味着工作副本将与你推送的最新版本不同步。为了避免混淆,建议只推送到裸仓库;即没有工作副本的仓库。原因是如果工作副本中有任何更改,你将没有机会得到警告并执行合并,因为你正在向远程仓库推送。
通常情况下,你应该只在工作副本内部进行修改,例如从其中进行拉取或检出。如果你希望在推送时自动在服务器上检出你的代码副本,则应设置一个post-receive hook,然后在具有工作副本的存储库中执行git pull

3

我在工作中有一个类似的用例: 我希望在许多服务器上拥有一个“纯净”的主目录,以便我可以检查进程、监视日志等等 - 而无需在添加新命令、别名、脚本等时更改每个服务器。从已有答案中学习后,我解决了这个问题:

  1. 在我的台式机上创建一个“主”存储库,代表我在远程期望的$HOME目录
  2. 使用我想要的设置(特别是使用规范化的.ssh/authorized_keys文件)将主存储库置于良好状态
  3. 在一个远程机器上,在$HOME中创建一个新的(非裸)存储库
  4. 将主存储库推送到远程$HOME中的存储库
  5. 在远程存储库中运行“git reset --hard”

为了保持它们的更新,我添加了以下git别名,以帮助我通过单个命令更新所有我的远程工作副本:

[alias]
    pushall = "!for remote in myremote{1..10}; do git push ${remote} master; ssh ${remote} git reset --hard; done"

现在当一个新的远程主机被配置好后,我会将现有远程主机上的$HOME目录通过rsync同步到新主机上,然后将我的新机器添加到上面的别名中。在进行更改(例如添加一个方便的新脚本来查看日志)后运行'git pushall',将会使用我想要的(远程)$HOME目录的原始副本更新所有远程工作副本。不再需要手动更新每个远程主机了!
注意:这里整个别名周围的双引号很重要,否则分号会影响你。
感谢其他人提供的答案,帮助我使其正常工作。

2
你不应该在远程主机上创建一个“标准”的git仓库,正如Brian Campbell所指出的。你应该做以下事情:
  1. 将您想要放入版本控制的所有文件复制到本地计算机上的一个目录中。
  2. 删除它们及其包含目录的远程主机上的内容。
  3. 仍然在远程主机上创建一个名为projectname.git(用有意义的名称替换projectname)的新目录,进入它,并运行git init --bare
  4. 在您放置文件的目录中,在本地计算机上:
    • 运行git init初始化一个git仓库
    • 运行git add .添加所有文件和子目录
    • 运行git commit -m“Initial commit”
    • 您应该看到类似于[master agd27c9] Initial commit的东西。
    • 运行git remote add origin ssh://hostaddress/path/to/dir/projectname.git(如果您通常使用ssh:// user @ hostaddress访问远程主机,则可能需要稍加修改)
    • 运行git push origin master
  5. 您应该看到一条消息,指示连接到您的远程主机,以及一些git的输出,指示推送成功。它通常类似于:
    Counting objects ...
    Delta compression ...
    Writing objects ...
    Total ...
    To ssh:// ...
  6. 如果一切都按上述描述发生了,您就完成了。如果您希望,可以添加默认推送和合并:
    • git config branch.master.remote origin && git config branch.master.merge refs/heads/master

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接