在Git推送之后,远程仓库将文件显示为已删除

时间:2010-09-21 15:10:47

标签: git

我在远程仓库中找不到任何文件。

  1. their tutorial
  2. 所述,在共享主机(site5)上创建了一个Git仓库
  3. 初始化并添加了一个简单的文本文件。行
  4. 克隆到我的本地(WinXP)计算机上。行
  5. 删除了我本地副本上的测试文件,添加了一些真实文件。行
  6. 承诺本地更改。行
  7. 推送到远程服务器。行
  8. MsysGit发出了一些警告(下面​​),但告诉我我们取得了成功。
  9. FTP进入远程服务器,但文件不在那里
  10. SSH(使用PUTTY)并运行git status。它给了我整个列表,但每个文件前面都有“删除”字样。见下文。
  11. 使用我不在任何分支上的提示,我检查了具体的提交。它找到了,但文件和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
    

3 个答案:

答案 0 :(得分:6)

当您在Git中推送到远程仓库时,它不会更新该远程仓库的工作副本。这意味着工作副本将与您推送的最后一个版本不同步。为避免这种混淆,建议只推送裸露的回购;没有工作副本的回购。原因是如果工作副本中的任何内容发生了变化,您将无法收到有关此事件的警告并执行合并,因为您正在推送远程仓库。

通常,您应该修改工作副本的唯一方法是从其中进行,例如从该工作副本中执行提取或结帐。如果您希望在推送时自动检查服务器某处的代码副本,则应设置post-receive hook,然后将git pull转到具有工作副本的存储库中。

答案 1 :(得分:3)

我在工作中有一个类似的用例:在我检查进程,监视日志等的许多服务器上需要'pristine'主目录 - 当我添加新命令时不必更改它们中的每一个,别名,脚本等。从这里的现有答案中学习我解决了这样的问题:

  1. 在我的桌面计算机上创建一个“主”回购,代表远程
  2. 上所需的$ HOME目录
  3. 使用我想要的设置(特别是使用规范的.ssh / authorized_keys文件)将主仓库恢复到良好状态。
  4. 在一台远程计算机上,在$ HOME
  5. 中创建一个新的(非裸)repo
  6. 将主控推送到$ HOME
  7. 中的远程仓库
  8. 在远程仓库中运行'git reset --hard'
  9. 为了让它们保持最新,我添加了以下git别名,以帮助我在一个命令中更新所有远程工作副本

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

    现在,在配置新的远程控制器时 - 我将$ HOME目录从现有远程控制台转换为新远程控制台,然后将我的新计算机添加到上面的别名中。在进行更改后运行'git pushall'(比如在添加一个方便的新脚本以查看日志之后)将使用我想要的(远程)$ HOME目录的原始副本更新所有远程工作副本。不再需要手动更新每一个遥控器!

    注意:整个别名的双引号在这里很重要,否则分号会咬你

    感谢其他人提供帮助我实现这一目标的现有答案。

答案 2 :(得分:2)

你不应该在远程主机上创建一个'标准'git仓库,正如Brian Campbell所说。你应该做什么:

  1. 将您希望置于版本控制下的所有文件复制到本地计算机上的目录中。

  2. 删除它们及其在远程主机上的包含目录。

  3. 仍然在远程主机上创建一个名为projectname.git的新目录(替换projectname的有意义的名称),cd进入它,然后运行git init --bare

  4. 在本地计算机上,在您放置文件的目录中:

    • 运行git init初始化git repo
    • 运行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