2013-09-30 73 views
0

我在尝试诊断一个别名的问题,该别名允许用户检出文件的最近提交,以便遏制其最近的更改。我不想重置重置,只需将旧版本检入到新一轮提交中即可。Git别名给出pathspec错误

如果没有错误地传递文件名,那么将整个回购分支到HEAD ^也是很重要的,因此-sh用于sh(如果$ 1没有填充某些东西时会窒息)。

如果有问题,我们都在同一个存储库中工作,并且我是唯一不是完整新手的用户,但我不是任何方式的git master。

我们在Windows 7

这里使用MsysGit 1.8.4是别名:

[alias] 
    back1=!sh -uc 'git checkout HEAD^ $1 ' - 

然而,这有时会像

$ git back0 format_tests.sas 
error: pathspec 'format_tests.sas' did not match any file(s) known to git. 

错误但是如果我跑

$ git checkout HEAD^ format_tests.sas 

直接从命令行,它工作正常。它似乎也很好地测试另一个git存储库。

我觉得这可能是一个引用问题,但我不知道在这一点上。

我不使用下面介绍的方法的原因是,如果我运行没有文件的命令,我会得到类似于以下内容的东西,这在我们的新手环境中是不正确的(为什么我使用shell命令“-u”开关):

testgit.git/ (j=0,r=0)$ git back1 
Warning: you are leaving 1 commit behind, not connected to 
any of your branches: 

    a77dfed hlksdj; 

If you want to keep them by creating a new branch, this may be a good time 
to do so with: 

git branch new_branch_name a77dfed 

HEAD is now at 954f639... blakjsd 

感谢您的兴趣和帮助!

回答

1

你的别名,并不需要通过shell中运行,你应该能够做到这一点:

[alias] 
    back=checkout HEAD^ -- 

Git会自动追加别名参数,这意味着:

$ git back afile bfile cfile 

会变成这样:

$ git checkout HEAD^ -- afile bfile cfile 

奖励:注意使用双连字符的“ - ”,这告诉CH eckout其余参数是所有文件,否则可能会错误地将文件解释为现有分支或其他参考文件。

为了解决海报中使用shell命令别名的要求,问题是子shell会将其工作目录设置为存储库的根目录。下面是git help config不得不说:

alias.* 
    [...] Note that shell commands will be executed from the 
    top-level directory of a repository, which may not necessarily be 
    the current directory. GIT_PREFIX is set as returned by 
    running git rev-parse --show-prefix from the original current directory. 

好消息是GIT_PREFIX变量,你可以在你的命令,像这样使用:

back1=!sh -uc 'git checkout HEAD^ -- "$GIT_PREFIX/$1"' - 
+0

在我们的环境中,没有文件运行此给出了一个奇怪的事情 - - 我编辑了上面的问题来描述它。奇怪的事情会导致混乱。否则,我甚至不会担心别名。 – forkandwait

+0

感谢您对答案的更新,而不只是说RTFM;)。将它标记为已回答,但我即将尝试使用更好的错误消息进行扩展,这可能会破坏所提供的良好修改... – forkandwait