While the date format is indeed, for instance, YYYY-MM-DD, "git fetch --shallow-since=<cutoff>
" had a problem:
If you specify a cut-off point that is newer than the existing history, it used to end up grabbing the entire history.
Such a request now errors out with Git 2.19 (Q3 2018).
See commit e34de73 (26 May 2018) by Nguyễn Thái Ngọc Duy (pclouds
).
(Merged by Junio C Hamano -- gitster
-- in commit 208ee59, 25 Jun 2018)
upload-pack
: reject shallow requests that would return nothing
Shallow clones with --shallow-since
or --shalow-exclude
work by running rev-list to get all reachable commits, then draw a boundary between reachable and unreachable and send "shallow" requests based on that.
The code does miss one corner case: if rev-list
returns nothing, we'll have no border and we'll send no shallow requests back to the client (i.e. no history cuts).
This essentially means a full clone (or a full branch if the client requests just one branch).
One example is the oldest commit is older than what is specified by --shallow-since.
To avoid this, if rev-list
returns nothing, we abort the clone/fetch.
The user could adjust their request (e.g. --shallow-since
further back in the past) and retry.
Another possible option for this case is to fall back to a default
depth (like depth 1).
But I don't like too much magic that way because we may return something unexpected to the user. If they request "history since 2008" and we return a single depth at 2000, that might break stuff for them.
It is better to tell them that something is wrong and let them take the best course of action.
git clone --shallow-since=YYYY-MM-DD
worked just fine to clone a new local repo for me.. why do you say it 'deepens or shortens the shallowness of an existing clone. It does not make a new clone be a shallow clone'? – Dipetalous