I am trying to use the lerna run build --since master command in an action to only build packages that have changed in the branch. Lerna is running this git command to do that: git diff --name-only master -- packages/<package name>. That results in this error: lerna ERR! fatal: bad revision 'master'.
I've tried many different options and commands from the README in this project but nothing seems to work. I've set the fetch depth to 0 to fetch all history and I've tried manually specifying a git command like so:
- uses: actions/checkout@v2
- run: |
git fetch --prune --unshallow origin master
Nothing seems to make master available for Lerna to compare against. Any help would be appreciated.
What happens if you use refs/remotes/origin/master as the argument to --since?
lerna run build --since refs/remotes/origin/master
As far as I can tell, reading the source of this action, the only explicit symbolic ref available in a branch build will be the branch itself, _not_ the default branch (usually master). Using the fully-qualified refs/... path ...might work?
I did manage to get this working by doing a few things (which might not all be necessary):
fetch-depth: 0 to the checkout actiongit fetch --prune to the checkout actionlerna run build --since origin/masterThat seems to do the trick so this issue can probably be closed, however it would be nice if this were in the docs. I'd be happy to submit a PR if this is something others think should be included.
I had a similar issue with fetching master (not related to Lerna). The last comment from @iansu helped - especially origin/master part.
I agree that it should be in the docs. I'd expect something like "Fetch master branch" item right after "Fetch all branches".
Is the issue because fetch depth is 1 by default? I'm updating to docs to make this more clear.
@ericsciple depth=1 is only one reason. origin/master was another reason (master didn't work).
@dmpetrov thanks. Sorry I'm missing something. Excluding lerna from the picture, does anything require origin/master?
The ref inputs master and refs/heads/master both work, but origin/master does not.
Here is my workflow:
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
ref: master # works
- continue-on-error: true
run: "rm -rf * ; rm -rf .*"
- uses: actions/checkout@v2
with:
ref: refs/heads/master # works
- continue-on-error: true
run: "rm -rf * ; rm -rf .*"
- uses: actions/checkout@v2
with:
ref: origin/master # does not work
@ericsciple I needed to get the last sha in master git log -n 1 master --pretty=format:%H while the workflow is working in my last commit in PR. So, I need a full git history before running the command:
- uses: actions/checkout@v2
with:
fetch-depth: 0
...
- name: whatever
run: |
echo "Fetch the whole repository"
git fetch --prune
Even with this "full git history" I'm unable to run the command
- name: whatever2
run: |
LAST_COMMIT=$(git log -n 1 master --pretty=format:%H)
>>
fatal: ambiguous argument 'master': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
If I specify origin/master it works just fine. I'd appreciate it if you give me a better explanation of the issue.
@dmpetrov this works for me:
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
ref: master
- run: |
git log -n 1 master --pretty=format:%H
master is the local branch (refs/heads/master) whereas origin/master is the remote branch (refs/remotes/origin/master). Technically they may not point to the same thing.
In your case it appears you don't have a local branch master. What does git branch show?
If this is running on a branch/PR you can't really set ref: master because you want to checkout the branch not master. So there is no local reference to master even if you run git fetch.
@iansu is right.
It seems like I have to use origin/ in git log or fetch origin/master.
Closing this issue now. I updated the docs to mention in the readme summary that only a single commit is fetched by default (with fetch depth 0)
I think mentioning that in the docs is helpful but it doesn't really solve the problem. You could add an option to the checkout action to always fetch master in addition to the current ref or make it so ref takes an array of things to check out.
It would also be nice to add an example in the documentation that shows how to use Lerna with GitHub Actions. It's a very commonly used tool with monorepos. I'd be happy to help with any of this work.
So for everyone who lands here via google. My workflow looks like:
# example lerna task
lerna run test --since origin/master
- uses: actions/checkout@v2
- run: |
git fetch --no-tags --prune --depth=1 origin +refs/heads/master:refs/remotes/origin/master
I only need the origin/master. If you need all branches use this run command (via docs)
git fetch --no-tags --prune --depth=1 origin +refs/heads/*:refs/remotes/origin/*
This worked too:
- name: Checkout Repository
uses: actions/checkout@v2
with:
fetch-depth: 0
...
...
...
- name: Lint
run: npx lerna run lint --since origin/master
This looked cleaner but https://github.com/actions/checkout/issues/118#issuecomment-595438258 looks more resource efficient.
--since does not work to me, it is not available anymore. fetch-depth: 0 does the trick to me.
Most helpful comment
So for everyone who lands here via google. My workflow looks like:
I only need the
origin/master. If you need all branches use this run command (via docs)