git推送到远程仓库,但似乎什么都没有上传到repo

Tro*_*yvs 1 git upload push file master

我在Mac上并尝试"git push"到本地repo模拟器目录:

mkdir ~/gitremote
cd ~/gitremote
git init --bare
Run Code Online (Sandbox Code Playgroud)

然后在另一个目录中:

git clone /Users/trosky/gitremote
vi readme (add one line)
git add .
git commit -m "1st file"
git push -u origin master

Counting objects: 2, done.
Writing objects: 100% (2/2), 211 bytes | 0 bytes/s, done.
Total 2 (delta 0), reused 0 (delta 0)
To /Users/trosky/gitremote/
   c0a3498..ff5511b  master -> master
Branch master set up to track remote branch master from origin.
Run Code Online (Sandbox Code Playgroud)

一切似乎都好.但在〜/ gitremote下:

$ls
HEAD        config      hooks       objects
branches    description info        refs
Run Code Online (Sandbox Code Playgroud)

似乎根本没有上传"自述"文件.我试过几次这个测试,总是一样的问题.当我成功地git push to master时会发生什么,而"远程"仓库没有任何东西.

tor*_*rek 5

Git不推送文件.就此而言,存储库不会直接存储文件 - 无论如何(但请参阅下面几段).存储库存储提交,git推送提交.

一个整点--bare克隆是避免任何文件,所以不存在的文件中提交的方式来获得.如果你确实有文件,他们可能会阻止更新提交.

您可能想知道:没有文件的系统有什么用?实际上,它根本不会好,因此存储库存储提交,每个提交代表整个目录树的快照,其中包含完整的文件.然后,您可以指示Git 从存储库中保存的所有提交集中提取任何提交.

现在,如果当你这样做的直接GIT中提取一些承诺,做一个完整的目录每一个保存在特定的承诺,你需要给Git的一个地方文件这些文件.普通的非--bare存储库有一个与众不同的地方,称为工作树(或者有时是工作树或类似工具).此工作树允许您查看所有文件,更改它们,添加新文件,删除文件,然后从结果中进行新的提交.

换句话说,工作树就是你工作的地方.

如果您正在工作树中进行工作,而其他人将提交提交您的存储库,并且新提交用于将您的工作树替换为其提交的树,那么您的所有工作会发生什么?一切都会丢失!因此,当您的存储库具有工作树时,Git通常会拒绝对您的存储库的推送.1

因此,Git提供了存储库.裸存储库是没有工作树的存储库.没有工作树,没有人可以在其中工作,所以推动不会失去工作.因此,它可以作为一个你可以随时安全推动的地方.这就是全部,但这非常重要.

如果你想看到被推到纯仓库的提交(及其文件),可以使非裸克隆,并且获取从推到库中,到非裸克隆,然后检查出的提出问题.这将取代你的工作2 - 但是既然说"现在就做"你必须意味着,而不是仅仅因为他们现在正在推动你的工作而被他们的工作粗暴地覆盖.

正如脚注所暗示的那样,有很多警告和调整,但这是基本的设置.裸克隆纯粹是用于推入,而非裸克隆是您工作的地方.


1实际上,只有在推送到当前分支时,它才是可控的.

2平时git checkout也试图确保你不会丢失任何你没有保存的工作.您可以告诉它"强制"覆盖您自己的工作,或者先使用git reset --hard丢弃您自己的工作,这里有很多复杂的边缘情况,但Git通常会将所有提交的数据视为永久性且不可磨灭的.工作树数据要少得多.