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

时间:2016-12-26 08:05:53

标签: git file upload push master

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

mkdir ~/gitremote
cd ~/gitremote
git init --bare

然后在另一个目录中:

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.

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

$ls
HEAD        config      hooks       objects
branches    description info        refs

似乎"自述"文件根本没有上传。 我试过几次这个测试,总是一样的问题。什么时候我可以成功地git push to master,而" remote"回购没什么。

2 个答案:

答案 0 :(得分:5)

Git没有推送文件。就此而言,无论如何,存储库都不能直接存储文件(但请参阅下面的几段)。存储库存储提交,git推送提交。

--bare克隆的重点是避免使用任何文件,这样就没有文件可以阻止提交。如果你确实有文件,他们可能会阻止更新提交。

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

现在,如果你指示Git提取一些提交 - 使一个目录充满了在该特定提交中保存的每个文件 - 你需要给Git一个位置给这些文件。一个普通的非--bare存储库有一个与众不同的地方,称为工作树(或者有时候是工作树或类似的)。此工作树允许您查看所有文件,更改它们,添加新文件,删除文件,然后从结果中进行提交。

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

如果您正在工作树中执行工作,并且其他人将提交推送到您的存储库,并且该新提交用于替换使用他们的已提交树的工作树,你的工作会发生什么?一切都会丢失!因此,当您的存储库具有工作树时,Git通常会拒绝对您的存储库的推送。 1

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

如果要查看推送到裸存储库的提交(及其文件),可以从推送到的存储库中创建非裸克隆和获取,非裸克隆,然后签出有问题的提交。这将取代你的工作 2 - 但是因为说"现在就做"你必须意味着,而不是仅仅因为他们现在正在推动你的工作而被你的工作粗暴地覆盖。

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

1 事实上,只有在推送到当前分支时,它才会被控制。

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

答案 1 :(得分:1)

您的提交已成功记录在gitremote存储库中。尝试再次克隆repo,您​​将看到“1st file”commit。