为了避免错误,是否可以将git分支的本地副本完全设置为只读?
我正在处理一个我拥有完全权限的git存储库 我想暂时检查主分支,以便详细查看一些文件,以便了解它们与我的功能分支的区别。(git diff命令非常有用,但目前它不适用于我的目的。) 我真的很想避免无意中写信给主分支的可能性 有没有一种简单的方法可以让我的本地版本的分支暂时只读,而不冻结我团队中其他人的分支 您可以使用 并使为了避免错误,是否可以将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/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”
将本地主分支的状态恢复到远程主分支的状态(注意,这将永久丢弃工作树/索引中任何未提交的更改)