Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用git权限(用于私人回购网站代码)?_Git_Git Push - Fatal编程技术网

使用git权限(用于私人回购网站代码)?

使用git权限(用于私人回购网站代码)?,git,git-push,Git,Git Push,这可能是关于惯例、最佳实践和/或个人偏好的问题: 所以我是一个GitNoob,我的网站代码不值得分享,所以我没有使用github之类的东西 知道git不需要中央存储库,我想:太好了,我的工作站和服务器是两个节点,我将把更改从工作站推送到服务器 开始时,代码仅在服务器上,因此我: 在服务器上:git init 在工作站上:git克隆me@myserver:路径/目的地/回购 愉快地做出改变,并在当地做出承诺 在工作站上:git推送me@myserver:路径/目的地/回购 我得到了奇怪的结果。我在

这可能是关于惯例、最佳实践和/或个人偏好的问题:

所以我是一个GitNoob,我的网站代码不值得分享,所以我没有使用github之类的东西

知道git不需要中央存储库,我想:太好了,我的工作站和服务器是两个节点,我将把更改从工作站推送到服务器

开始时,代码仅在服务器上,因此我:

  • 在服务器上:
    git init
  • 在工作站上:
    git克隆me@myserver:路径/目的地/回购
  • 愉快地做出改变,并在当地做出承诺
  • 在工作站上:
    git推送me@myserver:路径/目的地/回购
  • 我得到了奇怪的结果。我在本地添加的文件出现在服务器上,但对现有文件的更改没有反映出来

    然后,我读到一条警告,禁止推送到签出的远程分支。因此,新的设置是:

  • 运行git clone--bare创建一个裸机存储库
  • 将裸存储库放在我的服务器上(
    ~/repos/mysite.git
    -不是公用文件夹)
  • 代码本地和:git推送me@myserver:repos/mysite.git
  • 在服务器上:
    git pull~/repos/mysite.git
    获取最新信息
  • 这是正确的吗?这合乎逻辑吗?这就是您要做的吗?

    您的新设置是设置服务器存储库的正确方法


    有关更多信息,请参阅Pro Git一章。

    无论您选择做什么,您都可能希望使用一点自动化。钩子是git将在某些事件上执行的一组脚本。这里相关的是更新后挂钩(在服务器的存储库中)。在正常回购中,挂钩位于
    .git/hooks
    中,因此在裸回购中,挂钩位于
    挂钩中。该目录当前可能包含许多示例钩子脚本(在最新版本中命名为
    *.sample
    )。您需要制作一个名为
    post update
    ,其中包含在服务器被推送到后要执行的任何操作(例如,将cd发送到另一个repo并执行拉操作)

    至于你的解决方案的细节。。。你没有挤进一个签出的分支,这样做是正确的。您所做的唯一可能的问题是,服务器最终会得到一个仅用于签出文件的存储库的额外副本。如果您决定不喜欢这样浪费磁盘空间,我很确定这会满足您的要求:

    git --work-tree=/path/to/checkout-dir --bare reset --hard
    
    这告诉git使用给定的路径作为工作目录,将其重置为正确的状态,但请记住存储库实际上是空的。我以前从未亲自做过这种事情,但它似乎在我的小测试中起作用


    注意:如果您决定无论如何都要推入已签出的分支(仅当服务器上的repo永远不会用于任何操作,而只是推入并签出文件的副本时)。。。如果您完全确定这一点,可以在服务器的gitconfig中将receive.denyCurrentBranch设置为false,在服务器上执行
    git reset--hard
    ,强制其工作目录进入其应处于的状态。

    阅读“为什么在“git push”?“in”之后我看不到远程repo中的更改(在git Wiki上).

    专门为我所做的事写了一章。在问更多Git问题之前,我会先阅读ProGit。。。