So, since the release Vec remains valid after you call check::github, you cannot move out of asset, since that would make a certain entry of the vector invalid, hence the vector invalid.
You have to clone the asset, either in the match statement or while returning from check::github.
You can't move out of references because then the reference would point to nothing, which is a violation of the memory model of the language.
You can't "invalidate" the vector because it is still being borrowed. It shouldn't matter for the semantics of a reference whether you create it from something that is inside your function or from something that is out of your control. If transitively invalidating references were allowed based on this, it would be very confusing, because the information required for that analysis is non-local.
Incidentally, "grab a part of this and invalidate the whole" is ownership, so you are simply looking for another language construct, not a reference. If you are trying to perform actions on a vector which require that you have ownership on the vector, then give out and acquire ownership. You could change the signature of github() to fn github(_: Vec<Release>) -> Opion<Asset> so that it would give you back the Asset by-value, consuming the vector of Releases.
So I'm not sure anymore what you are trying to do. If you indeed need the vector for more than one operation, and you are trying to remove a single element from it, then pass a mutable reference (&mut Vec<Release>) and call remove() or swap_remove() on it.