为了避免错误,是否可以将git分支的本地副本完全设置为只读?

为了避免错误,是否可以将git分支的本地副本完全设置为只读?,git,github,version-control,Git,Github,Version Control,我正在处理一个我拥有完全权限的git存储库 我想暂时检查主分支,以便详细查看一些文件,以便了解它们与我的功能分支的区别。(git diff命令非常有用,但目前它不适用于我的目的。) 我真的很想避免无意中写信给主分支的可能性 有没有一种简单的方法可以让我的本地版本的分支暂时只读,而不冻结我团队中其他人的分支 您可以使用 并使.git/hooks/pre-commit #!/bin/sh if [ $USER != "git-repo-admin" ]; then if [ "$1" == re

我正在处理一个我拥有完全权限的git存储库

我想暂时检查主分支,以便详细查看一些文件,以便了解它们与我的功能分支的区别。(git diff命令非常有用,但目前它不适用于我的目的。)

我真的很想避免无意中写信给主分支的可能性

有没有一种简单的方法可以让我的本地版本的分支暂时只读,而不冻结我团队中其他人的分支

您可以使用

并使
.git/hooks/pre-commit

#!/bin/sh
if [ $USER != "git-repo-admin" ];
then
  if [ "$1" == refs/heads/master ];
  then
    echo "Pushing to master is restricted"
    exit 1
  fi
fi
如果您自己保存此脚本
.git
,这将不会冻结其他开发人员的分支

您可以用来防止此情况发生

并使
.git/hooks/pre-commit

#!/bin/sh
if [ $USER != "git-repo-admin" ];
then
  if [ "$1" == refs/heads/master ];
  then
    echo "Pushing to master is restricted"
    exit 1
  fi
fi

如果您自己保存此脚本,这不会冻结其他开发人员的分支

对此可能有更好的答案,因此我将保留问题,但我现在要做的是:

git checkout master #BE CAREFUL! JUST COPY IT SOMEWHERE AND GO BACK TO YOUR BRANCH!

mkdir ~/fake-project-master-delete-me-after-september-2017

cp -r ./* ~/fake-project-master-delete-me-after-september-2017

git checkout feature/123456
如果您有一个非常大的存储库,这当然会占用大量的驱动器空间。我还是希望有更好的办法

====


编辑:迪伦和玛丽娜在我发布这篇文章的时候发布了他们的答案。对于大多数情况,这几乎肯定更好。

对此可能有更好的答案,所以我将保留问题,但我现在要做的是:

git checkout master #BE CAREFUL! JUST COPY IT SOMEWHERE AND GO BACK TO YOUR BRANCH!

mkdir ~/fake-project-master-delete-me-after-september-2017

cp -r ./* ~/fake-project-master-delete-me-after-september-2017

git checkout feature/123456
如果您有一个非常大的存储库,这当然会占用大量的驱动器空间。我还是希望有更好的办法

====


编辑:迪伦和玛丽娜在我发布这篇文章的时候发布了他们的答案。对于大多数情况,这些方法几乎肯定更好。

有两种方法可以使用:

选项1:保护github中的主分支 即使您错误地提交了
master
分支,git也会阻止您将本地master分支推送到github

保护
master
as的方法是:在您的github repo->设置->分支->选择
master
->合并之前需要请求审核->保存更改。 所以您不能直接对主分支进行更改,您应该使用PR将更改合并到主分支

如果您仍然需要以某种方式直接对
master
分支进行更改,可以使用选项2

选项2:在本地回购中使用预提交挂钩 在本地repo的
.git/hooks
中,将pre-commit.sample重命名为
pre-commit
。并在
预提交中添加以下脚本:

#!/bin/sh

branch=$(git rev-parse --abbrev-ref HEAD)
if [[ $branch == "master" ]]
then
 {
   git reset HEAD .
   git checkout -- .
   echo "you tried to commit on master branch, recover master branch and stoppped! "
   exit 1
 }
fi
现在,如果您错误地在
master
分支上提交,git将重置
master
分支作为原点,并用消息提示您


注意:命令
git reset HEAD.
git checkout--.
将放弃
master
分支上所有未提交的更改。这是基于变化的,没有用。如果要在
分支上保持未提交状态,可以忽略这两个命令。

有两种方法可以使用:

选项1:保护github中的主分支 即使您错误地提交了
master
分支,git也会阻止您将本地master分支推送到github

保护
master
as的方法是:在您的github repo->设置->分支->选择
master
->合并之前需要请求审核->保存更改。 所以您不能直接对主分支进行更改,您应该使用PR将更改合并到主分支

如果您仍然需要以某种方式直接对
master
分支进行更改,可以使用选项2

选项2:在本地回购中使用预提交挂钩 在本地repo的
.git/hooks
中,将pre-commit.sample重命名为
pre-commit
。并在
预提交中添加以下脚本:

#!/bin/sh

branch=$(git rev-parse --abbrev-ref HEAD)
if [[ $branch == "master" ]]
then
 {
   git reset HEAD .
   git checkout -- .
   echo "you tried to commit on master branch, recover master branch and stoppped! "
   exit 1
 }
fi
现在,如果您错误地在
master
分支上提交,git将重置
master
分支作为原点,并用消息提示您


注意:命令
git reset HEAD.
git checkout--.
将放弃
master
分支上所有未提交的更改。这是基于变化的,没有用。如果您想在
master
分支上保持未提交状态,可以忽略这两个命令。

仅输出消息并以1退出是否足够,其中的两个git命令是否会放弃其所有更改?是的,这两个命令将放弃master分支上的更改。这只是怀疑这些更改不需要应用于特性分支的情况之一。我最初的目的是展示预提交钩子是如何工作的。但是无论如何谢谢@LasseV.Karlsen,我会在我的回答中声明它。仅仅输出消息并用1退出难道还不够吗,那里的两个git命令不会放弃他的所有更改吗?是的,这两个命令将放弃主分支上的更改。这只是怀疑这些更改不需要应用于特性分支的情况之一。我最初的目的是展示预提交钩子是如何工作的。但是无论如何谢谢@LasseV.Karlsen,我会在我的回答中声明它。如果你真的想确保不修改本地主机,你可以简单地执行分离签出(
git checkout--detach master
)。这样,如果你要做某事,它就不会出现在任何分支上。但是,除非您推动提交,否则意外提交到本地主机并不是真正的问题。如果您意外地提交到本地主分支,您可以简单地通过“
git reset--hard origin/master”
将本地主分支的状态恢复到远程主分支的状态(注意,这将永久丢弃工作树/索引中任何未提交的更改)