我知道如果我在裸存储库中有文件,我可以使用git show HEAD:path/to/file.
但是我可以在不克隆和修改工作树的情况下向裸存储库添加新内容吗?
我正在使用一个代码库,我需要为了不同的目的同时在多个分支上工作。所以我克隆到一个裸存储库,然后设置一些工作树:
git clone --bare ssh://git@git.example.com/project/repo repo.git
cd repo.git
git worktree add ../branch-1 branch-1
git worktree add ../branch-2 branch-2
... someone else creates branch-3 and pushes is ...
git fetch origin +refs/heads/*:refs/heads/* --prune
git worktree add ../branch-3 branch-3
Run Code Online (Sandbox Code Playgroud)
现在工作branch-3树没有设置为跟踪远程树并试图让它这样做,我陷入了可怕的混乱。
$ cd ../branch-3
$ git branch -u origin/branch-3
error: the requested upstream branch 'origin/refs/heads/feature/SW-5884-move-database-container-to-alpine-base-2' does not exist
hint: ...<snip>
$ git fetch +refs/heads/*:refs/remotes/origin/* --prune
$ git branch -u origin/branch-3
fatal: Cannot setup tracking information; starting point 'origin/feature/SW-5884-move-database-container-to-alpine-base-2' is not a …Run Code Online (Sandbox Code Playgroud) 我们的服务器上有git 1.5.4.3(2008年2月的版本).看来,当时没有选择--bare.
那我怎么能创建一个裸存储库呢?
在本地创建它并将其scp到服务器将是一种选择,但需要付出太多努力.或者是否可以使用本地 git命令创建新的远程存储库?
我创建了一个共享仓库:
git init --bare my_project.git
Run Code Online (Sandbox Code Playgroud)
在某些时候,另一个用户用他的更改(使用git push)更新了这个仓库.
我如何检查共享仓库中现在存在哪些文件以及它们的内容是什么?
在当地的回购协议,我能做的只是ls和cat <some file>,但在共享回购没有工作目录...
我正在尝试在主 git 存储库中的更新上创建 git hook。我想防止破坏任何测试的推送。如何获取更新后项目的裸存储库代码以对其运行测试?
PS:当然可以使用预提交挂钩而不是更新,在这种情况下挂钩应该位于提交者的 PC 上,但我相信这应该是在服务器上进行验证的一种方法。
我有一个小的 PHP 库,我编写它来支持各种 Web 项目。这些项目都在 git 中,库是每个 repos 的子模块。Web 项目使用 git push 部署,部署脚本需要访问库子模块 repo 以更新库。
有时对于任何给定的项目,库都会有自己的分支,直到我将这些更改合并回主分支。
我已经为该库设置了一个裸远程仓库,并且能够将库子模块推送到远程仓库。效果很好,我可以在远程仓库中看到这些提交。但是,当我尝试部署时,找不到这些提交。事实上,如果我自己克隆远程仓库,我找不到那些提交。
例如,远程仓库看起来像这样:-
git log --graph --oneline --date-order
* 9c9b880 (BRANCHA)
* e88ee92
* 07260c9
* 40b0963
* 35b6533 (tag: dev/0.0.2, master) Merge branch 'refs/heads/development'
|\
| * ba3c1bd (HEAD, development)
| * eefa611
| * 1b87828 Merge branch 'refs/heads/BRANCHB' into development
| |\
| | * 9078c1c (BRANCHB)
| |/
| * 834e715
| * a000cd7
|/
* 5985fc9 Initial commit
Run Code Online (Sandbox Code Playgroud)
但是,如果我按如下方式克隆远程仓库:-
git clone …Run Code Online (Sandbox Code Playgroud) 我很确定之前已经问过这个问题,但我似乎找不到它.很抱歉,如果它是一个dublicate.
我有一个裸存储库,我们称之为project_x.git,如果我们检查它所说的配置文件
[core]
repositoryformatversion = 0
filemode = false
bare = true
symlinks = false
ignorecase = true
hideDotFiles = dotGitOnly
Run Code Online (Sandbox Code Playgroud)
所以它肯定是正确的,裸=真.现在我正在尝试用清理版替换master.
$ git push origin :master
remote: Updating references: 100% (1/1)
To http://gitrepo.local/git/project_x.git
! [remote rejected] master (branch is currently checked out)
error: failed to push some refs to 'http://gitrepo.local/git/project_x.git'
Run Code Online (Sandbox Code Playgroud)
我正在使用gitblit btw,这不是实际的服务器URL.
这个回应让我感到困惑,我怎样才能在我的裸仓库上设立一个结账分支?谁在那个分支上工作:),没有任何意义.要么它不是一些配置明智或gitblit与我搞乱.我不明白?
怎么了?
顺便说一句,如果我尝试的话
git push -f ,
Run Code Online (Sandbox Code Playgroud)
编辑:这有效但你不能删除我之前尝试过的分支.
谢谢
我有一个带有裸git存储库的服务器,我推送到实时部署.它有一个简单的post-receive钩子,用最新的更新我的服务器代码master.
当生产服务器上发现错误时,我有时需要恢复到特定的过去提交(我在本地测试自己,但我没有捕获所有内容).有没有一个很好的*方法来恢复到这个设置的过去提交?
*很好,我的意思是一个单行,如推到裸库: git push prod master
我想制作一个带有多个分支(主,开发,发布等等)的git裸存储库.所以问题是,是否有可能检查裸存储库或如何在分支之间切换(切换是否有意义)?
当我想推送到裸存储库时,我可以在裸存储库上进行合并,还是必须在本地进行合并并推送适当的分支?所以寻找正确的方法:-)
谢谢彼得
在远程机器上,我使用以下命令创建一个裸存储库:
git init --bare $HOME/bare/My-Repo
Run Code Online (Sandbox Code Playgroud)
在我的本地机器上,我克隆了一个 repo(但不是我在远程机器上创建的那个):
git clone ssh://something.com/My-Repo
Run Code Online (Sandbox Code Playgroud)
在我的本地机器上,在我刚刚克隆的存储库中,我创建了一个对位于远程机器上的上述裸存储库的“引用”:
git remote add my_remote ssh://remote.com/${USER}/bare/My-Repo
Run Code Online (Sandbox Code Playgroud)
我不知道它是否与我的问题有关,但我还在本地存储库中执行以下操作:
git config remote.my_remote /some/path/git-receive-pack
git config remote.my_remote /some/path/git-upload-pack
Run Code Online (Sandbox Code Playgroud)
现在,我可以从本地存储库推送到远程机器上的裸存储库:
git push my_remote master
Run Code Online (Sandbox Code Playgroud)
现在,我们的想法是我们在远程机器上创建另一个存储库,它应该从裸存储库中获取一些内容。我通过在远程机器上执行这样的事情来创建这个 repo:
some_script.sh $HOME/bare/My-Repo $HOME/My-Repo
Run Code Online (Sandbox Code Playgroud)
现在,我做的一些改变$HOME/My-Repo在远程机器上(请注意,它不是裸仓库),然后我git add和git commit之后,我推:
git push origin my-dev-branch
Run Code Online (Sandbox Code Playgroud)
结果我推送到裸存储库(位于同一台远程机器上)。之后,我转到我的本地机器并从远程机器(从裸存储库)“获取”更改:
git fetch my_remote
git checkout -b my-dev-branch my_remote/my-dev-branch
git fetch origin
git rebase origin/master
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是:为什么我们需要这个裸存储库?为什么我们不能只有一个远程存储库,直接在本地和远程存储库之间交换内容?或者,为什么我们不能只是rsync (或scp)本地存储库往返于远程机器?
添加
这就是为什么我问这个问题而不是谷歌搜索。我用谷歌搜索了我的问题,第一个链接在这里:http : //www.saintsjd.com/2011/01/what-is-a-bare-git-repository/
我在那里读到:
使用 git …
git ×11
git-bare ×11
git-branch ×2
githooks ×2
git-config ×1
git-remote ×1
git-worktree ×1
init ×1
tdd ×1